关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断

时间:2025-02-11 19:54:16
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; }