1. 程式人生 > >20 表示數值的字串

20 表示數值的字串

題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路: [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]

其中,('['和']'之間的為可有可無的部分)。

在數值之前可能有一個表示正負的'+'或者'-'。接下來是若干個0到9的數位表示數值的整數部分(在某些小數裡可能沒有數值的整數部分)。如果數值是一個小數,那麼在小數後面可能會有若干個0到9的數位表示數值的小數部分。如果數值用科學記數法表示,接下來是一個'e'或者'E',以及緊跟著的一個整數(可以有正負號)表示指數。

判斷一個字串是否符合上述模式時,首先看第一個字元是不是正負號。如果是,在字串上移動一個字元,繼續掃描剩餘的字串中0到9的數位。如果是一個小數,則將遇到小數點。另外,如果是用科學記數法表示的數值,在整數或者小數的後面還有可能遇到'e'或者'E'。

class Solution {
public:
    bool isNumeric(char* string)
    {
        if(string==NULL||*string=='\0')
            return false;
        if(*string=='+'||*string=='-')
            ++string;
        bool isnum=true;
        isint(&string);
        if(*string!='\0')
        {
            if(*string=='.')
            {
              ++string;
              isint(&string);
                if(*string=='e'||*string=='E')
                    isnum=isexp(&string);
            }
            else if(*string=='e'||*string=='E')
                isnum=isexp(&string);
            else 
                return false;
        }
        return isnum&&(*string)=='\0';
    }
private:
    void isint(char** string)  //函式引數需要指標傳遞的方式,所以是雙指標
    {
        while(**string!='\0'&&**string>='0'&&**string<='9')  //掃描如果是數字,直接跳過
            ++(*string);
    }
    bool isexp(char** string)
    {
        ++(*string);  //這裡不能少,判斷是‘e’ 得先後移一位
        if(**string=='+'||**string=='-')
            ++(*string);
        if(**string=='\0')  
            return false;   //符號後面必須要有數字
        isint(string);
        if(**string=='\0')
            return true;
        else
            return false;
    }
};