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; } };