表示数值的字符串
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路
两个概念:
- 符号数: ‘+’ ‘-’ 或无符号开头 + 0-9数字
- 无符号数:纯0-9数字组成的
基本思路:
- 首先扫描有没有符号数,当前判断为 has1
- 判断是否有小数点,有的话,在小数点后扫描无符号数has2 , 目前的判断结果为:has3 = has1 || has2
- 判断是否有e/E,有的话,扫描有符号数has4, 当前判断结果为 has5 = has4 && has3
- 如果string当前到结尾了, 且 has5 ,则该字符串表示数字,否则,都不是。
实现
#include <iostream>
using namespace std;
class Solution {
public:
bool scanUnsignedInteger(char ** str)
{
char * st = *str;
char * p = st;
while (*p >= '0' && *p <= '9')
++p;
*str = p;
return p > st;
}
bool scanInteger(char ** str)
{
char * p = *str;
if (*p == '+' || *p == '-')
p++;
*str = p;
return scanUnsignedInteger(&(*str));
}
bool isNumeric(char* string)
{
bool isNum = false;
isNum = scanInteger(&string);
if (*string == '.')
{
++string;
bool isTmp = scanUnsignedInteger(&string);
isNum = isNum || isTmp;
}
if (*string == 'e' || *string == 'E')
{
++string;
isNum = isNum && scanInteger(&string);
}
return isNum && *string == '\0';
}
};
void main()
{
char str[20] = "123.45e+6";
bool isNum = Solution().isNumeric(str);
cout << isNum << endl;
system("pause");
}