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.
Update (2015-02-10):
The signature of the C++
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
题目检测一个Str是否是一个有效的科学数字。
类似的检测应该都可以状态机完成。这里模拟状态机的方式实现的。代码如下:
bool isNumber(char* s) {
// (' ')(+-)(0-9)(.)(0-9)e(+-)(0-9)(' ')
// step 1 2 3 4 5 6 7 8 9
int step = 1;
bool hasNum = false;
while(*s != '\0'){
char c = *s;
if(c >= '0' && c <= '9'){
hasNum = true;
if(step <= 2){
step = 3;
}else if(step == 9){
return false;
}else if(step == 4){
step = 5;
}else if(step == 6 || step == 7){
step = 8;
}
}else if(c == ' '){
if(step == 1 || step == 9){
}else if(step == 4){
if(!hasNum){
return false;
}
step = 9;
}else if(step == 2 || step == 6|| step == 7){
return false;
}else{
step = 9;
}
}else if(c == '.'){
if(step <= 3){
step = 4;
}else{
return false;
}
}else if(c == 'e'){
if(step == 3 || step == 5 || (step == 4 && hasNum)){
step = 6;
}else{
return false;
}
}else if(c == '+' || c == '-'){
if(step == 1){
step = 2;
}else if(step ==6){
step = 7;
}else{
return false;
}
}else{
return false;
}
++s;
}
if(hasNum == false && step == 4){
return false;
}
if(step == 1||step == 2|| step == 6 ||step == 7){
return false;
}
return true;
}