Valid Number
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.
该题目测试数据集特别丰富。
主要注意以下明显情况:
1、前后出现空白。
2、2e或者2E,E后面未接其他数字是false的
3、小数点出现的位置。(只能在e前)
4、e前面要有数据出现 ".E"或“.”是不对的
很经典的一个划分,就是以E为界限,划分为前后2部分 firstPart 和secondPart 来讨论各种情况。
最后:根据数据集慢慢测试调整。
学习下文后,得出代码:http://www.cnblogs.com/remlostime/archive/2012/11/18/2775938.html
class Solution {
public:
bool isNumber(const char *s) {
assert(s);
int n=strlen(s);
const char *end;
end= s+n-1;
bool dotAppear=false;
bool eAppear=false;
bool firstPart=false; //以E为分界线
bool secondPart=false;
while(isspace(*s))s++;
while(isspace(*end))end--;
if(*s=='+'|| *s=='-')s++;
while(s!=(end+1)){
if(isdigit(*s)){
if(!eAppear)
firstPart=true;
else
secondPart=true;
}
else if(*s=='.'){
if(dotAppear ||eAppear || secondPart)
return false;
else
dotAppear=true;
}
else if(*s=='e' || *s=='E'){
if(eAppear)
return false;
else
eAppear=true;
}
else if(isspace(*s))
{
return false;
}
else if(*s=='+' || *s=='-'){
if(*(s-1)=='e' || *(s-1)=='E')
;
else
return false;
}
else{
return false;
}
s++;
}
if(!firstPart)return false;
else if(eAppear && !secondPart)
return false;
return true;
}
};
还有一种方法:判断是否为数字,类似于函数strtod()
函数名: strtod
功 能: 将字符串转换为double型值
用 法: double strtod(char *str, char **endptr);
函数说明:strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。
// @author 连城(http://weibo.com/lianchengzju)
/*调用strtod()*/
class Solution{
public:
bool isNumber(const char *s){
char *endptr;
strtod(s,&endptr);
if(endptr==s)return false; //数字就不存在 例如:s=" "
for(;*endptr!='\0';++endptr)
if(!isspace(*endptr))return false; //如果剩余的不是空格,就表示出错。
return true;
}
};