此题出自牛客网的剑指offer专题
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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 string = String.valueOf(str);
return string.matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
}
}
思路二:定义三个变量decimal,sign,hasE分别作为判断小数点,符号,e/E是否出现出现过的标志
进行层层校验,只要有一项校验不成功,则返回false
实现代码如下:
public class Solution {
public boolean isNumeric(char[] str) {
if(str.length == 0){
return false;
}
boolean decimal = false,sign = false,hasE = false;
//逐个字符进行校验
for(int i=0;i<str.length;i++){
if(str[i]=='e'||str[i]=='E'){
//e/E出现,那么其后面必须有数字
if(i==str.length-1){
return false;
}
//E/e只能出现一次
if(hasE){
return false;
}
hasE = true;
} else if(str[i]=='+'||str[i]=='-'){
//如果为第一次出现,且不在第一位,则必须跟在e/E后面
if(!sign && i>0 && str[i-1]!='e' && str[i-1] != 'E'){
return false;
}
//如果为第二次出现,则必须跟在e/E后面
if(sign && str[i-1]!='e' && str[i-1]!='E'){
return false;
}
sign = true;
} else if(str[i]=='.'){
if(hasE || decimal){
return false;
}
decimal = true;
} else if(str[i]<'0' || str[i]>'9'){
//最后再判断非法字符
return false;
}
}
//所有校验已经通过
return true;
}
}