我们首先分析一下子可能是数值的字符串的格式 在数值之前可能有一个表示正负的’-‘或者’+’。 接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。 如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。 判断一个字符串是否符合上述模式时,
#include <iostream>
using namespace std;
// 调试开关
#define __tmain main
#ifdef __tmain
#define debug cout
#else
#define debug 0 && cout
#endif // __tmain
class Solution
{
public:
bool isNumeric(char* str)
{
if(str == NULL)
{
return false;
}
// 可能遇见符号+/-
if(*str == '+' || *str == '-')
{
++str;
}
if(*str == '\0')
{
return false;
}
bool numberic = true;
// 处理可能遇见的数字
ScanDigits(&str);
if(*str != '\0')
{
if(*str == '.')
{
++str;
ScanDigits(&str);
if(*str == 'e' || *str == 'E')
{
numberic = IsExponential(&str);
}
}
else if(*str == 'e' || *str == 'E')
{
numberic = IsExponential(&str);
}
else
{
numberic = false;
}
}
return numberic && *str == '\0';
}
void ScanDigits(char **str)
{
while(**str != '\0'
&& (**str >= '0' && **str <= '9'))
{
++(*str);
}
}
bool IsExponential(char **str)
{
if(**str != 'e' && **str != 'E')
{
return false;
}
++(*str);
if(**str == '+' || **str == '-')
{
++(*str);
}
if(**str == '\0')
{
return false;
}
ScanDigits(str);
return (**str == '\0') ? true : false;
}
};
int __tmain( )
{
Solution solu;
cout <<solu.isNumeric("1a23") <<endl;
return 0;
}