package niuke;
public class NumberString {
public static void main(String[] args) {
System.out.println(isNumeric("1.2.3".toCharArray()));
}
public static boolean isNumeric(char[] str) {
/* 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。*/
boolean flag = false;
boolean flag1 = false;
boolean flag2 = false;
for(int i = 0 ; i < str.length ; i ++) {
if( i == 0 ) {
if(str[i] == '+' || str[i] == '-' || (str[i] >= 48 && str[i] <= 57) || str[i] == '.') {
continue; //第一个字符不能出现e或者E
}else {
return flag;
}
}
else if(str[i] == 'e' || str[i] == 'E') {
if(!(str[i-1] >= 48 && str[i-1] <= 57)) {
return flag; //e或者E前面必须是数字
}
if(i == str.length-1)
return flag; //e不能是最后一个字符
flag1 = true;
continue;
}
else if(str[i] == '.') {
if(flag1 || flag2) { //只能又一个小数点,并且这个小数如果存在e要在e之前
return flag;
}
else if((str[i-1] >= 48 && str[i-1] <= 57) || str[i-1] == '+' || str[i-1] == '-') {
flag2 =true; //小数点之前可以是数字或者加号或者减号
continue;
}
else if(i == str.length-1) {
return flag; //小数点不能是最后一个字符
}
flag2 =true;
continue;
}
else if(str[i] == '+' || str[i] == '-') {
if(str[i-1] == 'e' || str[i-1] == 'E') {
continue; //此时这个加号或者减号已经不是第一个字符,所以必须再e之后
}else {
return flag;
}
}
else if((str[i] >= 48 && str[i] <= 57)) {
continue; //当是数字时就接着判定下一个
}
else {
return flag; //当不是数字,加号或者减号,或者e和小数点,则都是错误
}
}
return true;
}
}