Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
只需要考慮正負號,小數點,指數e符號,數字四種可能,除了它們之外的字元,程式返回false。
- 正負號:只能出現在第一個字元或者e後面,不能出現在最後一個字元
- 小數點:字串不能只含有小數點,也不能只含正負號和小數點,小數點不能在e或者小數點後
- e:e不能出現在第一個字元,也不能出現在最後一個字元,e前面不能沒有數字,也不能有e
class Solution { public: bool isVaild(char c){ if(c=='+' || c=='-' || c == '.' || c=='e' || c>='0'&& c <= '9') return true; else return false; } bool isNumber(const char *s) { string str(s); bool res = false; size_t pos = str.find_first_not_of(" "); if(pos!=string::npos) str=str.substr(pos); //去掉前端空格 else str=""; pos = str.find_last_not_of(" "); str=str.substr(0,pos+1); //去掉後端空格 if(str == "") return res; bool hasSign = false, hasDot = false, hasExp = false, hasDigit = false; int len = str.length(); for(int i = 0 ; i < len ;++ i){ char ch = str[i]; if(!isVaild(ch)) return false; switch(ch){ case '+': case '-': //不在第一個或者e後面;在最後一個字元 if((i!=0 && str[i-1]!='e') || i== len-1) return false; else hasSign = true; break; case '.': //只有一個字元的情況;只有符號和點;在e和點之後 if(len == 1 || (len == 2 && hasSign) || hasExp || hasDot) return false; else hasDot = true; break; case 'e': //出現在第一個或最後一個;前面沒有數字;前面有e if(i == 0 || i == len-1 || !hasDigit || hasExp) return false; else hasExp = true; break; default: hasDigit = true; break; } } return true; } };