题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3
分析:
判断字符串是否是数字,首先这个字符串必须只包括以下几种情况:
1)0---9之间的数字
2)e或者E,指数,不能在末尾,e后面如果有+ - 号,则正负号后面不能有小数点。比如 12e+4.3
3)+ - 表示正负,不能在末尾出现,正负号如果在中间,那么前一个是e或者E,后一个是0---9的数字 比如 -1e-16
4). 小数点只能有一个 比如 1.2.3
代码实现:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public boolean isNumeric(char[] str) {
String ss = String.valueOf(str);
// 先判断每个字符是否合法
int len = ss.length();
for(int i=0; i<len; i++){
char c = ss.charAt(i);
if(!((c>='0' && c <= '9') || c=='e' || c=='E' || c=='+' || c=='-'|| c=='.')){
return false;
}
}//
// 正负号,E不能在末尾
if(ss.charAt(len-1) == '+' || ss.charAt(len-1) == '-' || ss.charAt(len-1) == 'E' || ss.charAt(len-1) == 'e'){
return false;
}
// 判断小数点,只能有一个
if(ss.indexOf(".") != ss.lastIndexOf(".")){
return false;
}
// 正负号在中间的位置时,前面的是e,E,后面是数字
for(int i=1; i<len-1; i++){
char c = ss.charAt(i);
if(c == '+' || c=='-'){
if(!(ss.charAt(i-1) == 'e' || ss.charAt(i-1) == 'E') ||
!(ss.charAt(i+1)>='0' && ss.charAt(i+1)<='9')){
return false;
}
}
}//
// e的后面不能有数字12E+4.3
for(int i=1; i<len; i++){
char c = ss.charAt(i);
if(c == 'e' || c=='E'){
// if(i==len-1) return false;
if(ss.charAt(i+1) == '+' || ss.charAt(i+1) == '-'){
// 从i+2开始往后没有小数点.则返回-1
if(ss.indexOf(".", i+2) != -1){
return false;
}
}
}
}//
return true;
}
}