题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
public class Solution {
public boolean isNumeric(char[] str) {
// 'E'/'e'/'.' 都只能出现一次
boolean e = false;
boolean dot = false;
int i = 0;
// 正负号只能出现在第一位
if (str[i] == '+' || str[i] == '-') {
i++;
}
for (; i < str.length; i++) {
// 点 前面必须有数字,后面必须有数字
if (str[i] == '.' && !dot && i + 1 < str.length && isDigit(str[i + 1])) {
dot = true;
} else if ((i >= 1 && isDigit(str[i - 1])) && (str[i] == 'e' || str[i] == 'E') && !e) {
// e前面必须是数字,后面要么是数字要么是正负号
e = true;
dot = true;
if (i + 1 < str.length) {
// e 的下一位又拥有了一次 +- 号机会
if ((str[i + 1] == '+' || str[i + 1] == '-')) {
i++;
}
} else {
return false;
}
} else if (!(str[i] <= '9' && str[i] >= '0')) {
return false;
}
}
return true;
}
private boolean isDigit(char c) {
return c <= '9' && c >= '0';
}
}