1. 程式人生 > >劍指offer----表示數值的字串

劍指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);
        }
    }

};