Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
主要就是判断一个字符串是不是一个数字,这个题目不是很难,主要是要把所有的情况理清楚
首先有一些情况是允许的
1. 前后空格
2. "+","-"号
3. "1.", ".34","+.1"也被认为是正确的
然后就是常规的情况
比如出现两个 e 或者E 或者两个小数点是不对的,比如E后面没有数字是不对的
class Solution {
public:
bool isNumber(const char *s) {
if(s==NULL)
return false;
int i=0;
int j=strlen(s)-1;
while(s[i]==' ') i++;
while(j>=0 && s[j]==' ') j--;
if(i>j)
return false;
string str(s+i,j-i+1); //<初始化处理之后的字符串
int e;
bool hasE = false;
for(int i=0;i<str.length();i++)
if(str[i]=='e' || str[i]=='E'){
if(hasE)
return false; //<出现多个e
else{
hasE=true;
e=i; //<记录e出现的位置
}
}
if(hasE){
string str1(str.begin(),str.begin()+e);
string str2(str.begin()+e+1,str.end());
return isNumberWithoutE(str1) && isSignNumber(str2); //<出现e,将其前后划分为两数据
}
return isNumberWithoutE(str); //<直接对该字符串检查
}
bool isNumberWithoutE(string s){
if(s.length()==0)
return false;
if(s[0]=='+' || s[0]=='-')
s = string(s.begin()+1,s.end());
if(s.length()==0)
return false;
int dot;
bool hasDot = false;
for(int i=0;i<s.length();i++){
if(s[i]=='.'){
if(hasDot) //<出现多个小数点
return false;
else{
hasDot=true;
dot=i;
}
}
}
if(hasDot){
string str1(s.begin(),s.begin()+dot);
string str2(s.begin()+dot+1,s.end());
if(str1.length()==0 && str2.length()==0)
return false;
if(str1.length()==0)
return isPureNumber(str2);
if(str2.length()==0)
return isPureNumber(str1);
return isPureNumber(str1) && isPureNumber(str2); //<根据小数点将数据分开,进行检查
}
return isPureNumber(s);
}
bool isSignNumber(string s){
if(s.length()==0)
return false;
if(s[0]=='+' || s[0]=='-')
s = string(s.begin()+1,s.end());
return isPureNumber(s);
}
bool isPureNumber(string s){
if(s.length()==0)
return false;
for(int i=0;i<s.length();i++)
if(s[i]<'0' || s[i]>'9')
return false;
return true;
}
};
原文:http://blog.csdn.net/xietingcandice/article/details/43488723