题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100”,“5e2”,"-123”,“3.1416"和”-1E-16"都表示数值。 但是"12e”,“1a3.14”,“1.2.3”,“+-5"和"12e+4.3"都不是。
解题思路
- 数字符合
A[.[B]][e|EC]
和.B[e|EC]
的表达式,其中A
表示整数部分,B
表示小数部分,C
表示指数部分 A
可以有正负,但是B
没有e|E
之前、之后都必须有数字
public boolean isNumeric(char[] str) {
if (str == null || str.length == 0) return false;
int index = scanInteger(str, 0);
boolean numeric = index != 0;
//小数
if (index < str.length && str[index] == '.') {
index++;
int pre = index;
index = scanUnsignedInteger(str, index);
//1. 小数可以没有整数部分
//2. 小数后可以没有数字
//3. 小数后可以有数字
numeric |= index != pre;
}
//指数
if (index < str.length && (str[index] == 'e' || str[index] == 'E')) {
index++;
int pre = index;
index = scanInteger(str, index);
//1. e或者E之前必须有数字
//2. e或者E之后必须有数字
numeric &= index != pre;
}
return numeric && index == str.length;
}
private int scanInteger(char[] str, int s) {
if (s < str.length && (str[s] == '+' || str[s] == '-'))
s++;
return scanUnsignedInteger(str, s);
}
private int scanUnsignedInteger(char[] str, int s) {
while (s < str.length && str[s] >= '0' && str[s] <= '9') {
s++;
}
return s;
}