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

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

//分解问题,有e的话,判断e(E)的两边是不是数字,没e的话,直接判断整个字符串
//是不是数字,有多个e则以第一个e把字符串划分为两半
class Solution {
public:
//判断划分后的字符是不是数字
    bool sub_is_num(string str)
    {
        if(str.size()==0)return false;
        //判断第一个是否是符号位,如果是则去掉
        if(str[0]=='+'||str[0]=='-')
        {
            str=str.substr(1);
        }
        //定义一个标记mark,如果已经有一个小数点,当前字符也是小数点,则一定不是
        //一个数字
        bool mark=false;
        for(auto m:str)
        {
            if(m=='.')
            {
               if(mark==false)mark=true;
                else return false;
                continue;
            }
            //如果不为数字且不为小数点,则一定不是数字
            if(m<'0'||m>'9')return false;
        }
        //成功避开了所有不是数字的条件判断,那一定是个数字
        return true;
    }
    bool isNumeric(char* string1)
    {
        if(*string1=='\0')return false;
        //以第一个e(E)分割字符串为两半
        int mark_i=0;
        while(string1[mark_i]!='\0')
        {
            if(string1[mark_i]=='e'||string1[mark_i]=='E')break;
            ++mark_i;
        }
        if(string1[mark_i]=='\0')
        {
            return sub_is_num(string1);
        }
        else
        {
            string mark_string(string1);
            string str1(mark_string.begin(),mark_string.begin()+mark_i),str2(mark_string.begin()+mark_i+1,mark_string.end());
            //如果分成两半的字符串中的第二个字符串中含有'.',那整个字符串一定不是数字
            for(auto m:str2)
            {
                if(m=='.')return false;
            }
            return sub_is_num(str1)&&sub_is_num(str2);
        }
    }

};

你可能感兴趣的:(剑指offer)