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 isDigit(const char *ch) {
return *ch >= '0' && *ch <= '9';
}
bool allspace(const char *ch) {
while(*ch != '\0') {
if(*ch != ' ')
return false;
ch ++;
}
return true;
}
bool isNumber(const char *s) {
int ii = 0;
// Remove the spaces in the front.
while(*s == ' ') {
s ++;
}
// Skip '+' or '-'.
if(*s == '+' || *s == '-') {
s ++;
}
// If nothing input, return false;
if(*s == '\0')
return false;
// hasdleftnum represent has number. Or if has dot, represent has left number of the dot.
// hasdrightnum represent has number after the dot.
bool hasdleftnum = false;
bool hasdrightnum = false;
bool hasDot = false;
// Process number before e.
while(*s != '\0' && *s != 'e' && *s != 'E') {
if(isDigit(s)){
s ++;
if(hasDot)
hasdrightnum = true;
else
hasdleftnum = true;
continue;
}
if(*s == '.') {
s ++;
if(hasDot)
return false;
hasDot = true;
continue;
}
if(*s == ' ') {
if(allspace(s) && (hasdleftnum || hasdrightnum))
return true;
}
return false;
}
// If has dot, but no numbers, return false.
if(hasDot && !hasdrightnum && !hasdleftnum)
return false;
// If is at end return true;
if(*s == '\0') return true;
//Process number after e.
bool hasrightnum = false;
if(*s == 'e' || *s == 'E') {
s ++;
if(*s == '+' || *s == '-') s ++;
while(*s != '\0') {
if(isDigit(s)) {
s ++;
hasrightnum = true;
continue;
}
if(*s == ' ') {
if(allspace(s) && hasrightnum && (hasdleftnum || hasdrightnum))
return true;
}
return false;
}
}
// If has e, and both left and right of e has number, return true.
if((hasdleftnum || hasdrightnum) && hasrightnum)
return true;
return false;
}
};