题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
分析
一.一个字符串是数值的要求:
1)每个字符串都必须是 0--9,e,E,+, - , .(小数点)的格式
2)+ -,e,E,.不能在末尾
3)小数点只能出现一次
4)正负号在中间时,前面是e,E,后面是数字
5)e或者E的后面是+ -的时候,后面不能有小数点
public static boolean isNumeric(char[] str) {
String s = new String(str);
//
for (int i = 0; i < str.length; i++) {
char c = s.charAt(i);
if (!(c >= '0' && c <= '9') && c != '+' && c != '-' && c != '.' && c != 'e' && c != 'E') {
return false;
}
}
//
if (s.charAt(s.length() - 1) == '.' || s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-' || s.charAt(s.length() - 1) == 'e' || s.charAt(s.length() - 1) == 'E') {
return false;
}
//
if (s.indexOf(".") != s.lastIndexOf(".")) {
return false;
}
//
for (int i = 1; i < s.length() - 1; i++) {
char c = s.charAt(i);
if (c == '+' || c == '-') {
if (!(s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E') || !(s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9')) {
return false;
}
}
}
//
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
if (s.charAt(i + 1) == '+' || s.charAt(i) == '-') {
if (s.indexOf(".", i + 2) != -1) {
return false;
}
}
}
}
return true;
}
二.正则匹配
[] : 字符集合
() : 分组
? : 重复 0 ~ 1
+ : 重复 1 ~ n
* : 重复 0 ~ n
. : 任意字符
\\. : 转义后的 .
\\d : 数字
public boolean isNumeric(char[] str) {
if (str == null || str.length == 0)
return false;
return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
}
网友评论