请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = " .1 "
输出:true
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。
bool isnum (string &s){
int num=0, dot=0, nume=0;
int i=0;
while(i<s.length()){
if(isdigit(s[i])){
i++;
num++;
}
else if(s[i]=='.'){
if(dot>0||nume>0){
return false;
}
else{
dot++;
i++;
}
}
else if(s[i]=='e' || s[i]=='E'){
if(nume>0 || num==0){return false;}
nume++;
i++;
num=0;
}
else if((s[i]=='+' || s[i]=='-')&&(i==0 || s[i-1]=='e' || s[i-1]=='E')){
i++;
}
else{
return false;
}
}
return num;
}
int main(){
string s;
getline(cin, s);
if(s.length()==0){
return false;
}
int j=0;
while (s[j]==' ' && j<s.length())
{
j++;
}
s=s.substr(j);
while(s.back()==' '){
s.pop_back();
}
printf("%d", isnum(s));
return 0;
}