题目
实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如:字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示整数数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
解题思路
表示数值的字符串遵循模式A[.[B]][e|EC]或.B[e|EC]。其中A作为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着‘e’或‘E’为数值的指数部分,在小数里可能没有数值的小数部分。A部分不是必需的,若一个数没有整数部分,那它的小数部分不能为空。
规则:A和C都是可能以‘+’或者‘-’开头的09的数位串;B也是09的数位串,但前面不能有正负号。
- 先判断‘+’或‘-’的位置,是否在首部或者在e/E的后面。
- 判断小数点的位置,是否在开头或结尾,是否出现多次,是否出现在e/E的后面。
- 判断e/E的位置,e/E是否出现,出现的次数,是否位于字符串开头或结尾。
- 判断字符串中的字符是否处于0~9之间。
代码
class Solution{
public:
bool stringTonum(char *str)
{
if(str == NULL)
{
return false;
}
bool isNumber = true;
int stringLen = strlen(str);
int dot = 0;//小数点出现
int E_or_e = 0;
bool is_E_or_e = false;//是否出现E/e
for(int i = 0;i<stringLen;i++)
{
if(str[i] == '+' || str[i] == '-')
{
if(i == 0) //加号和减号放在开头
{
}
else
{
if(str[i-1] == 'E' || str[i-1] == 'e')
{
if(i == stringLen-1)
{
isNumber = false;
break;
}
}
else
{
isNumber = false;
break;
}
}
}
else if(str[i] == '.')
{
if(i == 0)
{
}
else if(i == stringLen-1)
{
isNumber = false;
break;
}
dot++;
if(dot>1)
{
isNumber = false;
break;
}
if(is_E_or_e)
{
isNumber = false;
break;
}
}
else if(str[i] == 'E' || str[i] == 'e')
{
is_E_or_e = true;
E_or_e++;
if(E_or_e > 1)
{
isNumber = false;
break;
}
if(i == stringLen-1)
{
isNumber = false;
break;
}
}
else
{
if(str[i] >='1' && str[i] <= '9')
{
}
else
{
isNumber = false;
break;
}
}
}
return isNumber;
}
};