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.
判断一个字符串是否是合法的数字
合法的数字包括:
class Solution { public: bool isNumber(const char *s) { if(s==NULL)return false; int len=strlen(s); int p1=0, p2=len-1; bool hasDot=false; //标记小数点是否已经出现过 bool hasSign=false; //标记正负号是否已经出现过 bool hasE=false; //标记e是否已经出现过 while(p1<=p2&&s[p1]==' ')p1++; while(p1<=p2&&s[p2]==' ')p2--; if(p1>p2)return false; //去掉首尾的空格 //第一个字符可以是数字,小数点,正负号 if(!(isdigit(s[p1]) || s[p1]=='-' || s[p1]=='+' || s[p1]=='.')) return false; else{ if(s[p1]=='-' || s[p1]=='+'){ hasSign=true; if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false; //如果正负号出现在第一位,则其后必须是小数点或者数字 } else if(s[p1]=='.') { hasDot=true; if(p1>=p2 || !isdigit(s[p1+1])) return false;//如果小数点出现在第一位,则他的后面必须出现数字。 } p1++; } //最后一个字符必须是数字或者小数点 if(!isdigit(s[p2]) && s[p2]!='.')return false; while(p1<=p2){ if(isdigit(s[p1])){ p1++; } else if(s[p1]=='-' || s[p1]=='+'){ //e的前后都能出现正负号,如果E已经出现过,则此时还能出现一次正负号。因此需要把标志位恢复成初始状态。 if(hasE)hasSign=false; if(hasSign)return false; //如果已经出现过正负号,则再出现是非法的 if(s[p1-1]!='e' && s[p1-1]!='E') return false; //正负号只可能出现在第一位或者紧跟着e出现 if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false; //正负号后必须是小数点或者数字 hasSign=true; p1++; } else if(s[p1]=='.'){ if(hasDot)return false; //小数点最多只能出现一次,且必须出现在e之前 if(hasE)return false; //小数点只能出现在E之前 if(p1==p2 && !isdigit(s[p1-1])) return false; if(p1<p2 && !isdigit(s[p1-1]) && !isdigit(s[p1+1]))return false; //小数点前后必须至少有一个位置出现数字。 hasDot=true; p1++; } else if(s[p1]=='e' || s[p1]=='E'){ if(hasE)return false; //E只能出现一次 if(s[p1-1]!='.' && !isdigit(s[p1-1]))return false; //e前面必须是小数点或者数字 if(s[p1+1]!='+' && s[p1+1]!='-' && !isdigit(s[p1+1]))return false; //e后面必须是正负号,或者数字 hasE=true; p1++; } else return false; } return true; } };
LeetCode: Valid Number [066],布布扣,bubuko.com
原文地址:http://blog.csdn.net/harryhuang1990/article/details/27171115