请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串"+100","5e2","-123","3.1416""-1E-16"都表示数值。

但是"12e","1a3.14","1.2.3","+-5""12e+4.3"都不是。

注意 :

  1. 小数可以没有整数部分,例如.123等于0.123;
  2. 小数点后面可以没有数字,例如233.等于233.0;
  3. 小数点前面和后面可以有数字,例如233.666;
  4. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
  5. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

样例:

输入: "0"

输出: true
class Solution
{
public:
    bool isNumber(string s)
    {
        int i = 0, j = s.size() - 1;
        while (i <= j && s[i] == ' ')
            i++;
        while (j < i && s[j] == ' ')
            j++;
        // 如果为空串
        if (i > j)
            return false;

        s = s.substr(i, j - i + 1);

        //判断数字开头 + -
        // substr 第二个参数为长度,为空,则一起拷贝到字符串末尾
        if (s[0] == '+' || s[0] == '-')
            s = s.substr(1);
        // -  +  -. +.
        if (s.empty() || s[0] == '.' && s.size() == 1)
            return false;

        int dot = 0, e = 0;
        for (int i = 0; i < s.size(); i++)
        {
            // 数字字符越过
            if (s[i] >= '0' && s[i] <= '9')
                ;
            else if (s[i] == '.')
            {
                dot++;
                // e. e12. 123.123.123
                if (dot > 1 || e)
                    return false;
            }
            else if (s[i] == 'E' || s[i] == 'e')
            {
                e++;
                // e后面没有数字 只有 123e 123e23e
                                // 注意 .e1 此种情况
                if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.')
                    return false;
                // 123e+ 123e-
                if (s[i + 1] == '+' || s[i + 1] == '-')
                {
                    if (i + 2 == s.size())
                        return false;
                    i++; //+ - 号过滤掉,重新循环
                }
            }
            else
                // 对于其它非目标元素 +-5, 去掉+后的-5
                return false;
        }
        return true;
    }
};
最后修改:2021 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏