题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
class Solution {
public:
//先找一遍看是否有E,如果有就把字符串分成两段来判断
//第一段检查是否是一个浮点数,第二段检查是否是整型
//检查浮点数时一旦找到小数点就又可以转换成检查
//小数点后半段时候是整型,然后检查每个数值前先检查
//第一位是否有正负号,有的话跳过一位
bool isNumeric(char* string)
{
if (string == nullptr)
return false;
int len = strlen(string);
if (len == 0)
return false;
int epos = -1;
for (int i = 0; i < len; ++i)
{
if (string[i] == 'e' || string[i] == 'E')
{
epos = i;
break;
}
}
if (epos > 0)
{
int start1 = 0, end1 = epos-1, start2 = epos+1, end2 = len-1;
if (start1 >= len || start2 >= len)
return false;
if (string[start1] == '+' || string[start1] == '-')
++start1;
if (string[start2] == '+' || string[start2] == '-')
++start2;
return isDouble(string, start1, end1) && isInt(string, start2, end2);
}
else
{
int start = 0, end = len-1;
if (string[start] == '+' || string[start] == '-')
++start;
return isDouble(string, start, end);
}
}
private:
bool isDouble(char* str, int start, int end)
{
if (start < 0 || end < 0 || start > end)
return false;
for (int i = start; i <= end; ++i)
{
if (str[i] == '.')
return isInt(str, i + 1, end);
else if (str[i] < '0' || str[i] > '9')
return false;
}
return true;
}
bool isInt(char* str, int start, int end)
{
if (start < 0 || end < 0 || start > end)
return false;
for (int i = start; i <= end; ++i)
{
if (str[i] < '0' || str[i] > '9')
return false;
}
return true;
}
};
|