题目描述:
Validate if a given string can be interpreted as a decimal number.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3 " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:
• Numbers 0-9
• Exponent - "e"
• Positive/negative sign - "+"/"-"
• Decimal point - "."
Of course, the context of these characters also matters in the input.
class Solution {
public:
bool isNumber(string s) {
int begin=0;
int end=s.size()-1;
while(s[begin]==' ') begin++;
while(s[end]==' ') end--;
s=s.substr(begin,end-begin+1);
if(s.size()==0) return false;
if(s[0]=='-'||s[0]=='+') s=s.substr(1);
if(s[0]=='.'&&s.size()==1) return false; //"-."不合法,先要除去加减号再判断
int dot_count=0;
int e_count=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
else if(s[i]=='.')
{
dot_count++;
if(dot_count>1) return false; //数字中最多一个.
if(e_count>0) return false; //如果数字中同时包含.和e,那么e必须在.之后,"e2.5"不合法
}
else if(s[i]=='e'||s[i]=='E')
{
e_count++;
if(e_count>1) return false; //数字中最多一个e
if(i==0||i==s.size()-1) return false; //开头或结尾为e不合法
if(s[i-1]=='.'&&i==1) return false; //".e1"不合法,但是"2.e3"合法
if(s[i+1]=='+'||s[i+1]=='-')
{
if(i+1==s.size()-1) return false; //当e和加减号是数字的最后两位,"e+"不合法
i++; //跳过下一个加号或减号,因为除去数字开头,加减号只能出现在e之后
}
}
else return false;
}
return true;
}
};