请实现一个函数用来判断字符串是否表示数值(包括整数和小数)
思路:逐个字符进行判断,e或E和小数点最多出现一次,而e或E的前一个必须是数字,且不能是第一个或最
后一个字符,符号的前一个字符不能是e或E。也可用正则表达式判断!
E或e:
后面必须有数字
不能有两个E
+或-:
第一次出现,是否在符号位;第一次出现并且不在符号位或者不是第一次出现,前一位必须为E
小数点:
只能有一个小数点
数值:
数字 e、E、+、-、.
public class Solution {
public boolean isNumeric(char[] str) {
//signal表示符号,decimal表示小树点,hasE表示含有符号e
boolean signal = false,decimal = false,hasE = false;
for(int i=0;i<str.length;i++){
if(str[i] == 'E' || str[i] == 'e'){
//e后面必须有数字,所以是最后一位肯定不通过
if(i==str.length-1){
return false;
}
//不能有两个e
if(hasE){
return false;
}
hasE = true;
}else if(str[i] == '+' || str[i] == '-'){
//不是第一次出现,那么后面能出现符合的地方只有紧贴着e的后面一位,不是则不通过
if(signal && str[i-1] != 'E' && str[i-1] != 'e'){
return false;
}
//第一次出现,如果不是出现在第一位,那么还是判断一下是不是出现在e的后面一位
if(!signal && i>0 && str[i-1] != 'E' && str[i-1] != 'e'){
return false;
}
signal = true;
}else if(str[i] == '.'){
//如果存在e并且e后面为小数则不通过
if(hasE){
for(;i>=0;i--){
if(str[i] == 'e' || str[i] == 'E'){
return false;
}
}
}
//不能有两个小数点
if(decimal){
return false;
}
decimal = true;
}else if(str[i] < '0' || str[i] > '9'){
//不是e也不是+-符号也不是小数点,那么只能是数字,不是数字就是非法的字符
return false;
}
}
return true;
}
}