请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:首先可以推出格式(+-)(num1)(.num2)([Ee](+-)(num3)),其中num123均为1-9的数字串。当Ee存在时,后面的数字才能存在。
1、使用正则表达式处理
2、一步一步按格式处理
代码一(正则):
#include <regex>
class Solution {
public:
bool isNumeric(char* str)
{
regex pattern("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
return regex_match(str, pattern);
}
};
代码二(模拟):
class Solution {
public:
bool isNumeric(char* str)
{
if(str == nullptr) return false;
// (+-)(num1)(.num2)[Ee](+-)(num3)
// 1 最开始的符号位
if(*str == '+' || *str == '-') str++;
// 2 num1
while(*str != '\0')
{
if(*str < '0' || *str > '9') break;
str++;
}
// 3 .num2
if(*str == '.')
{
str++;
// 类似12.是符合要求的
while(*str != '\0')
{
if(*str < '0' || *str > '9') break;
str++;
}
}
// 4 Ee
if(*str == 'E' || *str == 'e')
{
str++;
// 类似12e不符合要求
if(*str == '\0') return false;
if(*str == '+' || *str == '-') str++;
while(*str != '\0')
{
if(*str < '0' || *str > '9') break;
str++;
}
}
return *str == '\0';
}
};