题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:这里表示数字的字符有 0-9,e,E,“.”,“+”,“-”;
规则:
- +和 - 必须出现在第一位和E(e)后面一位,其他地方都不会出现
- 小数点 “.” 只能出现一次,前或者后必须有数字,而且小数点后面不能跟 E 或者 e
- e或者E后面可以跟(+或者-),但后面必须加数字,而且e或者E后面不能跟小数,即不存在 “.”
PS: 这里我测试过 128. 可以输出,+.1,-1. , 1.e1都可以,+.错误(可能编译器不同结果也不同)
代码如下:
class Solution {
public:
bool isNumeric(char* string)
{
if(string == NULL)
return false;
char* start = string;
bool flag2 = true;//小数点判断,只能出现一次
bool flag3 = true; // e或E只出现一次
while(*string != '\0')
{
if((string == start || *(string-1)=='e' || *(string-1)=='E' )&&(*string == '+'||*string == '-') )
string++;
if(*string =='.')//判断小数点只出现一次
{
if(flag2)
{
flag2 = false;
if(string == start && (*(string+1)<'0' || *(string+1)>'9'))
return false;
if( (*(string-1)<'0'|| *(string-1)>'9') && (*(string+1)<'0'|| *(string+1)>'9') )//小数点前后均不是数字
return false;
}
else
return false;
}
else if(*string>='0'&&*string<='9')
{}
else if(flag3 && (*string == 'E' || *string == 'e'))
{
if(string == start || *(string-1)=='+'|| *(string-1)=='-'|| *(string+1)=='\0')
return false;
flag2 = false;//e或者E之后不能有小数
flag3 = false;
}
else
return false;
string++;
}
return true;
}
};