题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
参考思路
其实该题是一个分类讨论问题,只需要满足一定的条件的字符串就是一个数值字符串。条件如下:
·±号后面必定为数字或后面为.(-.123 = -0.123)
·±号只出现在第一位或在eE的后一位
· 后面必定为数字或为最后一位(233. = 233.0)
· eE后面必定为数字或±号
参考代码
public class Solution {
public boolean isNumeric(char[] str) {
// 标志小数点和指数,表示小数点或者指数只能出现一次,两次则不是规范数值
boolean point = false, exp = false;
for(int i=0;i<str.length;i++){
//'+-'后面只能是数字或者‘.’
if(str[i] == '+' || str[i] == '-'){
if(i+1 == str.length || !(str[i+1]>='0' && str[i+1]<='9'
||str[i+1] == '.')){
return false;
}
// +-号只出现在第一位或eE的后一位
if (!(i == 0 || str[i-1] == 'e' || str[i-1] == 'E')) {
return false;
}
}
//'.'只能是最后一位或者后面是数字,此外如果已经是指数了,说了这个带'.'在exp后面,
//而指数不能为小数,因此exp也加入判断
else if(str[i] == '.'){
if(point || exp || i+1 == str.length ||!(str[i+1]>='0' && str[i+1]<='9')){
return false;
}
point = true;
}
//'Ee'后面必须是数字或者'+-'
else if(str[i] == 'E' || str[i] == 'e'){
if(exp || i+1 == str.length ||!(str[i+1]>='0' && str[i+1]<='9'
|| str[i+1] == '+' || str[i+1] == '-')){
return false;
}
exp = true;
}
//如果为数字则正常执行
else if(str[i]>='0' && str[i]<='9'){}
else{
return false;
}
}
return true;
}
}