关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断
List<Character> PlusMinus = new ArrayList<>(Arrays.asList('+', '-'));
public boolean isNumber(String s) {
// 1. 纯数字
if (isPureNumber(s)) return true;
// 2. 小数点
if (isDecimalPoint(s)) return true;
// 3. e/E
if (isScientificCM(s)) return true;
return false;
}
/**
* 判断是否可直接转为数字, 即是否全部为数字
*
* @param s
* @return
*/
boolean isPureNumber(String s) {
if (PlusMinus.indexOf(s.charAt(0)) != -1) {
s = s.substring(1);
}
boolean haveNum = false;
for (char c : s.toCharArray()) {
if (!Character.isDigit(c)) {
return false;
} else {
haveNum = true;
}
}
return haveNum;
/* 超界会返回false ,eg:016912630333
try {
(s);
return true;
} catch (NumberFormatException e) {
return false;
}*/
}
/**
* 是否合法带小数点
*
* @param s
* @return
*/
boolean isDecimalPoint(String s) {
if (PlusMinus.indexOf(s.charAt(0)) != -1) {
s = s.substring(1);
}
int count = 0;
boolean haveNum = false;
for (char c : s.toCharArray()) {
if (c == '.') {
if (++count > 1) return false;
} else if (!Character.isDigit(c)) {
return false;
} else {
haveNum = true;
}
}
return haveNum;
}
boolean isScientificCM(String s) {
s = s.toUpperCase();
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'E') {
if (++count > 1 || i == 0 || i == s.length() - 1) return false;
} else if (!Character.isDigit(s.charAt(i))
&& s.charAt(i) != '.'
&& PlusMinus.indexOf(s.charAt(i)) == -1) {
return false;
}
}
// 如果没有E
if (count == 0) return false;
String[] es = s.split("E");
// 第一部分是否合法
boolean part1 = isPureNumber(es[0]) || isDecimalPoint(es[0]);
// 第二部分是否合法
boolean part2 = isPureNumber(es[1]);
return part1 && part2;
}