请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
class Solution {
public:
bool isNumeric(char* str)
{
// 标记符号、小数点、e是否出现过
bool sign = false, decimal = false, hasE = false;
for (int i = 0; i < strlen(str); i++) {
// 先判断正负号:第一次出现的话不是在开头就是在指数e/E紧接着。第二次出现一定紧接着e/E
if(str[i] == '+' || str[i] == '-')
{
if(!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') // 第一次符号
return false;
if(sign && str[i-1] != 'e' && str[i-1] != 'E') // 第二次符号
return false;
sign = true;
}
else if (str[i] < '0' || str[i] > '9') // 判断字符是不是合法,如'a'通过ascii码的数值
return false;
else if(str[i] == '.') // 判断小数点:不能重复出现,不能出现在e/E后面
{
if(hasE || decimal)
return false;
decimal = true;
}
else if(str[i] == 'e' || str[i] == 'E') // 判断指数:后边不能没有整数,不能有两个e
{
if(i == (strlen(str) - 1)) // 指数在最后一位不合法
return false;
if(hasE) // 指数又接指数不合法
return false;
hasE = true;
}
}
return true;
}
};