题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
class Solution {
public:
bool isNumeric(char* string)
{
}
};
几个关键点:
1.基本边界。 string == NULL || *string == '\0'
2.检测是否有符号位
3.检测除符号位外的第一个有效位,有效位只能是数字或者小数点.
4.检测是否有E或者e,且不能重复出现
5.小数点不能重复出现
6.数字的合法性,不能是其他字母如‘a’等
• 12e说明e的后面必须有数字,不能有两个e
• ±5说明符号位要么出现一次在首位,要么出现一次在e的后一位,其他地方都不能有
• 12e4.3说明e的后面不能有小数,
• 1.2.3说明不能有两个小数点
• 1a3.14说明不能有其他的非法字符,比如这里的a
class Solution {
public:
bool isNumeric(char* string)
{
bool sign = false, decimal = false, hasE = false;
for(int i=0; i<strlen(string); i++)
{
if(string[i] == 'e' || string[i] == 'E')
{
if(i == strlen(string)-1)
return false;
if(hasE)
return false;
hasE = true;
}
else if(string[i]=='+' || string[i] == '-')
{
if(sign && string[i-1]!='e' && string[i-1]!='E')
return false;
if(!sign && i>0 && string[i-1]!='e' && string[i-1]!='E')
return false;
sign = true;
}
else if(string[i] == '.')
{
if(hasE || decimal)
return false;
decimal = true;
}
else if(string[i] >'9' || string[i]<'0')
return false;
}
return true;
}
};