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