// 题目描述
// 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
// 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
// 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
public static boolean isNumeric(char[] str) {
if (str == null) {
return false;
}
//第一个不是数字 + 或者减好
//多个小数点不是数字
//含有e|E意外的字母不是数字
//e|E后面跟小数不是数字
//含有多个符号不是数字
int dot = 0;
int countE = 0;
int countO = 0;
int countN = 0;
for (int i = 0; i < str.length; i++) {
if (str[i] >= '0' && str[i] <= '9') {
countN++;
}else if (str[i] == 'e' || str[i] == 'E') {
if (countN<=0){
return false;
}
//如果e前面不是数字
if (str[i-1]<'0'&&str[i-1]>'9'){
return false;
}
//因为e后面不能出现dot 所有
if (dot<1){
dot=1;
}
i++;
//e的下一位可以使+|-
if (i<str.length&&(str[i]=='+'||str[i]=='-')){
if ((i+1<str.length)){
if (!(str[i+1]<'9'&&str[i+1]>'0')){
return false;
}
countN++;
}else {
return false;
}
countO--;
}else if (i<str.length&&(str[i]<'9'&&str[i]>'0')){
countN++;
}else{
return false;
}
countE++;
}else if (str[i] == '+' || str[i] == '-') {
if (countN>0){
return false;
}
countO--;
}else if (str[i]=='.'){
dot++;
}else{
return false;
}
}
if (countN<=0||dot>1||countE>1||countO>1){
return false;
}
return true;
}