表示数值的字符串
约 436 字大约 1 分钟
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串 “+100”、“-123”、“5e2”、“3.1416” 及 “-1E-16” 都表示数值,但 “12e” 、“1a3.14”、“1.2.3”、“+-5” 及 “12e+5.4” 都不是
分析:
表示数值的字符串遵循模式: A[.[B]][e|EC] 或者 .B[e|EC],其中 A 为数值的整数部分,B为小数部分,C为 e或者 E 的指数部分。
public class CheckNumeric {
public static boolean isNumeric(char[] str) {
if (null == str || str.length == 0) return false;
//分别表示小数点,E/e,正负号是否出现过。
boolean hasD = false, hasE = false, sign = false;
int len = str.length;
for (int i = 0; i < len; i++) {
if (str[i] == 'e' || str[i] == 'E') {
//如果e出现在字符串的最后一位的话,肯定不正确
if (i == len - 1) return false;
//如果E已经出现过一次,这里是第二次出现的话,肯定也不对
if (hasE == true) return false;
hasE = true;
} else if (str[i] == '.') {
//如果在小数点之前已经出现过E的话,肯定不对
if (hasE == true) return false;
//如果在小数点之前已经出现过小数点的话,肯定不对
if (hasD == true) return false;
hasD = true;
} else if (str[i] == '+' || str[i] == '-') {
if (i > 0 && (str[i - 1] != 'e') && (str[i - 1] != 'E'))
//如果+和-号出现的位置不在第一位,而是在中间,并且他们前面一位不是E的话,肯定错误,包含了+和-号出现在最后一位的情况
//12e+3是数值
return false;
sign = true;
} else if (str[i] < '0' || str[i] > '9') {
//如果出现的字符小于0或者大于9的话,肯定也不对
return false;
}
}
return true;
}
}