字符串--7-表示数值的字符串 ***

参考:

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]+)?");
    }
}


猜你喜欢

转载自blog.csdn.net/ax_hacker/article/details/80857889