题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
code
- 合法的种类太多,因此从判断不合法入手
- 找规律,提炼要求:
- 只能存在+/-/e/E/./数字,存在其他字母则不是数字
- 小数点只能有一个
- +/-号只能存在于第一个位置或者e/E后边,+/-号后边只能跟数字或者小数点(或者说不能为空也不能是其他字母)
- e/E后面只能是整数(不能为空,也不能存在小数点)
class Solution {
public:
bool isIllegalLetter(char ch){//判断合法字母
if(ch=='+'||ch=='-'||ch=='e'||ch=='E'||ch=='.')
return true;
if(ch>='0'&&ch<='9')
return true;
return false;
}
bool isNumeric(char* string)
{
int decimalPoint=0;//小数点个数
for(int i=0; string[i]!='\0'; i++){
char ch=string[i];
if(!isIllegalLetter(ch))
return false;
if(ch=='+'||ch=='-'){
if(i>0&&string[i-1]!='e'&&string[i-1]!='E')
return false;
else if(!isdigit(string[i+1])&&string[i+1]!='.')//+-号后面可带小数点
return false;
}
if(ch=='e'||ch=='E'){
if(string[i+1]=='\0')
return false;
else{
for(int j=i+1;string[j]!='\0';j++){
if(string[j]=='.')
return false;
}
}
}
if(ch=='.'){
decimalPoint++;
if(decimalPoint>1)
return false;
}
}
return true;
}
};
测试数据
输入 | 输出 |
---|---|
+100 | 1 |
5e2 | 1 |
-123 | 1 |
3.1416 | 1 |
-1e16 | 1 |
-.123 | 1 |
12e | 0 |
1a3.14 | 0 |
1.2.3 | 0 |
±5 | 0 |
12e+4.3 | 0 |