剑指offer之表示数值的字符串

1.题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

2.问题分析

其实问题不是很复杂,只是需要考虑完整,需要对每一个字符进行判断,判断是否是数字,是否是逗号,是否是字符’e’或者’E’。如果有字符’e’或者’E’,那么数字就被e分成了两部分,前一部分数可以有逗号,后一部分数没有逗号。具体分析见代码:

3.源代码

bool isNumeric(char* string)
{
    if(string == NULL || *string == '\0')
        return false;
    int index = 0;
    //处理第一个字符是否'*'或者'-'
    if(string[index] == '+' || string[index] == '-')
        ++index;
    //一个数只能有一个小数点
    bool douhao = true;
    //'e'或者'E'把一个数分成两部分,如果字符串中有'e'或者'E',那么可能有第二部分
    bool secondPart = false;
    while(string[index] != '\0' )
    {
        char c = string[index];
        if(c == '.')
        {
            //只有一个逗号
            if(douhao)
            {
                ++index;
                douhao = false;
            }
            //有两个逗号则不是数字
            else
            {
                return false;
            }
        }
        //是数字,则进行下一位判断
        else if(isdigit(c))
        {
            ++index;
        }
        //是'e'或者'E',那么进行第二部分判断
        else if(c == 'e' || c == 'E')
        {
            ++index;
            secondPart = true;
            break;
        }
        //非逗号,非数字,非'e'或者'E',则不是数字,返回false
        else
        {
            return false;
        }
    }
    //第二部分判断
    if(secondPart)
    {
        //处理第一个字符是否'*'或者'-'
        if(string[index] == '+' || string[index] == '-')
            ++index;
        //看是否还有下一位
        if(string[index] == '\0')
            return false;
        while(string[index] != '\0')
        {
            if(!isdigit(string[index]))
                return false;
            ++index;
        }
    }
    return true;
}

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/83154713