题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
解析
对于java有多种方法,这里首先提供一般的方法:分类处理
在牛客网上还看到各种解法,虽然都是依靠java强大的函数库或者是java自己的一些特性,有些投机取巧的意味,但也反映了思路的灵活性。
1、一般方法
public class Solution {
boolean isNumeric(char[] s) {
if(s.length==0) return false;
if((s.length==1)&&(s[0]<'0'||s[0]>'9')) return false;
if(s[0]=='+'||s[0]=='-'){
if(s.length==2&&(s[1]=='.')) return false;
}else if((s[0]<'0'||s[0]>'9')&&s[0]!='.') return false;//首位既不是符号也不是数字还不是小数点,当然是false
int i = 1;
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
if(i<s.length&&s[i]=='.'){
i++;
//if(i>=s.length) return false;
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
}
if(i<s.length&&(s[i]=='e'||s[i]=='E')){
i++;
if((i<s.length)&&(s[i]=='+'||s[i]=='-')){
i++;
if(i<s.length) while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
else return false;
}else if(i<s.length){
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
}else return false;
}
if(i<s.length) return false;
return true;
}
}
2、正则表达式
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
}
3、借助java的异常处理类
public class Solution {
public boolean isNumeric(char[] str) {
try {
double re = Double.parseDouble(new String(str));
} catch (NumberFormatException e) {
return false;
}
return true;
}
}