请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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 n = s.size();
int index = -1;
bool hasDot = false,hasE = false,hasOp = false,hasNum = false;
while(index<n && s[++index]==' ');
while(index<n){
if('0'<=s[index] && s[index]<='9'){
hasNum = true;
}else if(s[index]=='e' || s[index]=='E'){
if(hasE || !hasNum) return false;
hasE = true;
hasOp = false;hasDot = false;hasNum = false;
}else if(s[index]=='+' || s[index]=='-'){
if(hasOp || hasNum || hasDot) return false;
hasOp = true;
}else if(s[index]=='.'){
if(hasDot || hasE) return false;
hasDot = true;
}else if(s[index]==' '){
break;
}else{
return false;
}
++index;
}
while(index<n && s[++index]==' ');
return hasNum && index==n;
}
};
用四个变量区分状态:hasNum,hasOp,hasE,hasDot
代码结构如下:
1.while循环1号–略去前置空格
2.while循环2号–逐字符操作
0-9 hasNum置1
e/E hasE置1,E前应该hasNum,后面是新的数字,其他三项置0
+/- hasOp置1,+/-应该出现在数字首部
. hasDot置1,点不能出现在e/E之后
空格 break
other 不应该含有其他字符
3.while循环3号–略去后置空格
4.判断hasNum并且下标移动到了字符串末尾
正则表达式
class Solution {
public boolean isNumber(String s) {
s = s.trim();
//排除三种情况。 空串,e前没有数字,只有.
String regex = "\\s*|([+-]?\\.?[eE][\\s\\S]*)|([+-]?\\.)";
if (s.matches(regex)) return false;
//对不是特殊情况的字符串,进行正则匹配
regex = "(([+-])?\\d*\\.?\\d*)([eE][+-]?\\d+)?";
return s.matches(regex);
}
}