Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
注意“e10"这种情况也是false
steps:
1. 跳过所有空格
2. 跳过正负号
3. 找到第一串数字n1 (before '.')
4. 找到第二串数字n2 (after '.')
5. 如果n1+n2 == 0 return false,说明底不知道
6. skip 'e' 'E'
7. skip '-' '+'
8. 找到第三串数字n3 (after 'e'/'E')
9. 如果n3 == 0, return false
10. 继续skip 空格,如果指针到了末尾,return true
public boolean isNumber(String s) {
int start = 0;
while (start < s.length() && s.charAt(start) == ' ') {
start++;
}
if (start < s.length() && (s.charAt(start) == '-' || s.charAt(start) == '+')) {
start++;
}
int end = start;
while (end < s.length() && s.charAt(end) >= '0' && s.charAt(end) <= '9') {
end++;
}
int n1 = end-start; // first number before '.'
start = end;
if (start < s.length() && s.charAt(start) == '.') {
start++;
}
end = start;
while (end < s.length() && s.charAt(end) >= '0' && s.charAt(end) <= '9') {
end++;
}
int n2 = end-start;
if (n1+n2 == 0) {
return false;
}
start = end;
if (start < s.length() && (s.charAt(start) == 'e' || s.charAt(start) == 'E')) {
start++;
if (start < s.length() && (s.charAt(start) == '-' || s.charAt(start) == '+')) {
start++;
}
end = start;
while (end < s.length() && s.charAt(end) >= '0' && s.charAt(end) <= '9') {
end++;
}
int n3 = end-start;
if (n3 == 0) {
return false;
}
start = end;
}
while (start < s.length() && s.charAt(start) == ' ') {
start++;
}
return start == s.length();
}
2014.11 update:
两个月后重新写了一遍,没有看参考,漏掉了几个想当然的case:1: 正负号,包括e后面的正负号;2: 0.e 就是第三个阶段没有判断e后面的数字是否存在