标签:
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.
Update (2015-02-10):
The signature of theC++
function had been updated. If you still see your function signature accepts aconst char *
argument, please click the reload button to reset your code definition.
1.有限自动机
2.strtod
bool isNumber(const char *s)
{
enum InputType
{
INVALID, // 0
SPACE, // 1 空格
SIGN, // 2 正负号
DIGIT, // 3 数字
DOT, // 4 点号
EXPONENT, // 5 指数
NUM_INPUTS // 6
};
const int transitionTable[][NUM_INPUTS] =
{
-1, 0, 3, 1, 2, -1, // next states for state 0
-1, 8, -1, 1, 4, 5, // next states for state 1
-1, -1, -1, 4, -1, -1, // next states for state 2
-1, -1, -1, 1, 2, -1, // next states for state 3
-1, 8, -1, 4, -1, 5, // next states for state 4
-1, -1, 6, 7, -1, -1, // next states for state 5
-1, -1, -1, 7, -1, -1, // next states for state 6
-1, 8, -1, 7, -1, -1, // next states for state 7
-1, 8, -1, -1, -1, -1, // next states for state 8
};
int state = 0;
for (; *s != ‘\0‘; ++s)
{
InputType inputType = INVALID;
if (isspace(*s))
inputType = SPACE;
else if (*s == ‘+‘ || *s == ‘-‘)
inputType = SIGN;
else if (isdigit(*s))
inputType = DIGIT;
else if (*s == ‘.‘)
inputType = DOT;
else if (*s == ‘e‘ || *s == ‘E‘)
inputType = EXPONENT;
// Get next state from current state and input symbol
state = transitionTable[state][inputType];
// Invalid input
if (state == -1) return false;
}
// If the current state belongs to one of the accepting (final) states,
// then the number is valid
return state == 1 || state == 4 || state == 7 || state == 8;
}
/*valid number,使用 strtod库函数*/
bool isNumber_strtod(string s)
{
const char *cstr = s.c_str();
char *endptr;
strtod(cstr, &endptr);
if (endptr == cstr) return false;
for (;*endptr;++endptr)
if (!isspace(*endptr)) return false;
return true;
}
标签:
原文地址:http://www.cnblogs.com/panweishadow/p/4854944.html