请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
1若干空格
2一个 小数 或者 整数
3(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
4若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-’)
下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
1(可选)一个符号字符(’+’ 或 ‘-’)
2至少一位数字
部分数值列举如下:
["+100", “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
部分非数值列举如下:
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]
class Solution {
public:
bool isNumber(string s) {
int i=0;
while(s[i]==' ') i++;//处理前面空格
if(s[i]=='+'||s[i]=='-') i++;//处理+-
i=integerAOrDecimal(s,i);//返回不是数字的一位 判断整数/小数
if(i==-1) return false;
if(s[i]=='e'||s[i]=='E'){
i++;
if(s[i]=='+'||s[i]=='-') i++;//处理+-
int temp1=i;
i=Isnum(s,i);
if(i==temp1) return false;//e后面没有数字则错误
}
while(i<s.size()&&s[i]==' ') i++;//处理后面的空格
if(i==s.size()) return true;
else return false;
}
//0-9
int Isnum(const string& s,int i){
while(i<s.size()&&s[i]>='0'&&s[i]<='9') i++;
return i;
}
int integerAOrDecimal(const string& s, int i){
int n_orig1 = i;
i = Isnum(s, i);
int n_vary1 = i;
// 判断是否是整数
if (s[i] != '.'){
return n_vary1 == n_orig1 ? -1 : n_vary1;//判断是否存在0-9的数值
}
// 判断是否是小数
// 跨过小数点
i ++;
int n_orig2 = i;
i = Isnum(s, i);
int n_vary2 = i;
if (n_orig1 == n_vary1 && n_orig2 == n_vary2) return -1;
//小数点前面后面至少有一个数
return n_vary2;
}
};