题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
Java源码实现:
public class Solution {
public boolean isNumeric(char[] str) {
if (str == null || str.length == 0) return false;
// 1.判断符号位(+、-)
boolean isNegative = false; // 判断str[0]代表的是+还是—,默认为正数
boolean isSignBit = false; // 判断str[0]是否为符号位
if (str[0] == '+' || str[0] == '-') {
isSignBit = true;
if (str[0] == '-') isNegative = true;
}
// 2.去除符号位后,如果字符串长度为1,且为'.'则不是数字
if (str.length == 1 && !(str[0] >= '0' && str[0] <= '9')) return false;
if (str.length == 2 && isSignBit && !(str[1] >= '0' && str[1] <= '9')) return false;
// 3.循环整个字符数组,判断边界值
int i = isSignBit ? 1 : 0;
int dot = 0;
int e = 0;
for (;i < str.length;i++) {
if (str[i] >= '0' && str[i] <= '9') ;
else if (str[i] == '.') {
dot++;
if (dot > 1 || e > 0) return false; // 1.2.3 12e+4.3
} else if (str[i] == 'e' || str[i] == 'E') {
e++;
if (i + 1 == str.length || e > 1 || i == 1 && str[0] == '.') return false;//12e 23e34e .e1
else if (str[i+1] == '+' || str[i+1] == '-') {
if (i + 2 == str.length) return false; // 12e+
}
} else if (str[i] == '+' || str[i] == '-') {
if (i + 1 == str.length) return false; // 12+
else if (e == 0) return false; // 1+34
} else return false; // 1a3.14
}
return true;
}
}