请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
用正则
public class Solution {
public boolean isNumeric(char[] str) {
String s = String.valueOf(str);
return s.matches("[+-]?[0-9]*(\\.[0-9]+)?([eE][+-]?[0-9]+)?");
}
}
不用正则,用标记位,记录特殊符号是否出现
public class Solution {
public boolean isNumeric(char[] str) {
boolean addMinor = false;
boolean hasE = false;
boolean decimal = false;
for(int i=0;i<str.length;i++){
if(str[i]=='+'||str[i]=='-'){
//如果之前已经有+-,那么必须在e后
if(addMinor == true && str[i-1]!='e' && str[i-1]!='E'){
return false;
}
if(addMinor == false ){
//如果第一次+-,且不在第一位,则必须在e后
if(i!=0 && str[i-1]!='e'&& str[i-1]!='E'){
return false;
}else{
addMinor = true;
}
}
}
else if(str[i]=='E' || str[i] == 'e'){
//Ee只能出现一次,且不能在第一位和最后一位,前面不能紧跟小数浮点,
if(hasE == true || i==0 ||str[i-1] =='.'||i==str.length-1){
return false;
}
hasE =true;
}
else if(str[i] =='.'){
//小数浮点只能出现一次,且不能在e后,不能在第一位
if(decimal==true ||hasE == true||i==0){
return false;
}
decimal = true;
}
//不能是除了特殊符号,数字,以外的其他符号
else if(str[i]-'0'>9 || str[i]-'0'<0){
return false;
}
}
return true;
}
}