参考:
https://blog.csdn.net/panda_AJ/article/details/69420293
http://cuijiahua.com/blog/2018/01/basis_53.html
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
判断一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。另外,如果是用科学记数法表示的数值,在整数或者小数的后面还有可能遇到'e'或者'E'。
#include <iostream>
#include <string>
using namespace std;
/*
首先判断是否有符号(+或者-),如果有,则对后面的字符串判断
然后扫描数字直到结束或是遇到其他字符,结束则返回true,否则继续按情况判断下一个需要判断的字符
如果是小数点'.',是则扫描数字,直到结束(返回true)或者遇到特殊字符,如果是e或E,那么对后面的数判断是否符合指数表示,如果是其他字符则返回false。
如果是e或者E,那么对后面的数判断是否符合指数表示。
如果不符合上面的情况则返回false
指数判断:
首先判断是否是符号,如果是,跳到下一位判断后面的是否是数字组成的串,是则表示指数表示是正确的,否则是不正确的。
*/
class Solution
{
public:
// 数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是
// 整数(可以有正负号,也可以没有),而B是一个无符号整数
bool stringIsNumber(string str)
{
const char *cstr = str.c_str();
if (cstr == NULL || *cstr == '\0')
return false;
bool numeric = scanInt(&cstr);
// 如果出现'.',接下来是数字的小数部分
// 下面代码用||的原因:
// 1. 小数可以没有整数部分,例如.123等于0.123;
// 2. 小数点后面可以没有数字,例如233.等于233.0;
// 3. 当然小数点前面和后面可以有数字,例如233.666
if (*cstr == '.')
{
++cstr;
numeric = scanUnsignedInt(&cstr) || numeric;
}
// 如果出现'e'或者'E',接下来跟着的是数字的指数部分
// 下面一行代码用&&的原因:
// 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
// 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4
if (*cstr == 'e' || *cstr == 'E')
{
++cstr;
numeric = scanInt(&cstr) && numeric;
}
return numeric && (*cstr == '\0');
}
private:
bool scanInt(const char **str)
{
if (**str == '+' || **str == '-')
++(*str);
return scanUnsignedInt(str);
}
bool scanUnsignedInt(const char **str)
{
const char *before = *str;
while (**str != '\0' && '0' <= **str && **str <= '9')
++(*str);
return *str > before;
}
};
int main()
{
Solution s;
string str;
getline(cin, str);
bool b = s.stringIsNumber(str);
if (b)
cout << "是整数或者小数" << endl;
else
cout << "不是整数或者小数" << endl;
system("pause");
return 0;
}
2、java正则表达式
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
}