• Java 字符串的数字校验:isNumeric,isNumericSpace和正则表达式,对比分析


    导读

            数字类型的判断是项目里常见的场景,相比一大串的非空,instanceof 以及大于小于0的判断,我更倾向于使用工具类 StringUtils 或者 正则表达式 来实现功能,追求代码的简洁和高效。

            你可能需要的博客:


    正文

    一、StringUtils 方法

            isNumeric() 和 isNumericSpace() 都属于 StringUtils,区别也就在字面意思里:对 Space(空格)的处理方式不用。

            使用 StringUtils 类,需要在 pom.xml 中引入“commons-lang3”依赖:

    1. <dependency>
    2. <groupId>org.apache.commonsgroupId>
    3. <artifactId>commons-lang3artifactId>
    4. <version>3.10version>
    5. dependency>

    1. StringUtils.isNumeric()

            目的:用来判断传入字符串是否为正整数。

    • 方法展示
    1. @Test
    2. void test_isNumeric(){
    3. System.out.println("正整数:" + StringUtils.isNumeric("123")); // true
    4. System.out.println("零:" + StringUtils.isNumeric("0")); // true
    5. System.out.println("负整数:" + StringUtils.isNumeric("-123")); // false
    6. System.out.println("小数:" + StringUtils.isNumeric("1.23")); // false
    7. System.out.println("null:" + StringUtils.isNumeric(null)); // false
    8. System.out.println("空格:" + StringUtils.isNumeric(" ")); // false
    9. System.out.println("空字符串:" + StringUtils.isNumeric("")); // false
    10. System.out.println("数字带空格:" + StringUtils.isNumeric("1 2 3")); // false
    11. }
    • StringUtils.isNumeric() 源码 

             isNumeric() 会遍历 CharSequence 字符并逐一校验,所以就需要参数字符串的每一位都满足【十进制数字】这一规则,所以,像“-123”或“+123”这样认知上为数字的字符串验证结果是 False。

    1. /** StringUtils.isNumeric() 源码 */
    2. public static boolean isNumeric(CharSequence cs) {
    3. // 1. 校验:'',空和null
    4. if (isEmpty(cs)) {
    5. return false;
    6. } else {
    7. int sz = cs.length();
    8. for(int i = 0; i < sz; ++i) {
    9. // 2. 校验:判断字符的一般类别是否为【十进制数字】
    10. if (!Character.isDigit(cs.charAt(i))) {
    11. return false;
    12. }
    13. }
    14. return true;
    15. }
    16. }

            如果进一步 DeBug 进入 Character.isDigit() 方法,会发现 isDigit() 属于 java.lang.Character,也就是说:isNumeric() 归根结底用的还是 Java 自带的字符判断方法。

    1. /** 当前方法属于 java.lang.Character */
    2. public static boolean isDigit(char ch) {
    3. return isDigit((int)ch);
    4. }

            进一步 DeBug 进入  isDigit() , 核心代码是 Character.getType() 方法,它的作用就是:判断字符的一般类别是否为【十进制数字】(十进制数字返回9,其他类型自己看源码)。

    1. /** 当前方法属于 java.lang.Character */
    2. public static boolean isDigit(int codePoint) {
    3. // getType() 目的是获取 codePoint 的类型
    4. // Character.DECIMAL_DIGIT_NUMBER = 9
    5. return getType(codePoint) == Character.DECIMAL_DIGIT_NUMBER;
    6. }

    2. StringUtils.isNumericSpace()

            目的:用来判断传入字符串是否为正整数,字符串里的空格不影响结果。

    • 方法展示
    1. @Test
    2. void test_isNumericSpace(){
    3. System.out.println("正整数:" + StringUtils.isNumericSpace("123")); // true
    4. System.out.println("零:" + StringUtils.isNumericSpace("0")); // true
    5. System.out.println("负整数:" + StringUtils.isNumericSpace("-123")); // false
    6. System.out.println("小数:" + StringUtils.isNumericSpace("1.23")); // false
    7. System.out.println("null:" + StringUtils.isNumericSpace(null)); // false
    8. System.out.println("空格:" + StringUtils.isNumericSpace(" ")); // true
    9. System.out.println("空字符串:" + StringUtils.isNumericSpace("")); // true
    10. System.out.println("数字带空格:" + StringUtils.isNumericSpace("1 2 3")); // true
    11. }
    • StringUtils.isNumericSpace() 源码

            isNumericSpace()与isNumeric()的区别在于,isNumericSpace() 对空格以及空字符串的处理结果也为 True,就算是字符串内部的空格也会自动忽略掉,这些改变在源码里可以清晰的看出差别。

    1. /** StringUtils.isNumericSpace() 源码 */
    2. public static boolean isNumericSpace(CharSequence cs) {
    3. // 1. 这里没有 isEmpty() 判空,只校验了 null
    4. if (cs == null) {
    5. return false;
    6. } else {
    7. int sz = cs.length();
    8. for(int i = 0; i < sz; ++i) {
    9. // 2. 这里排除了“空格”的情况,认为不为正整数且同时不为''时,才返回 False
    10. if (!Character.isDigit(cs.charAt(i)) && cs.charAt(i) != ' ') {
    11. return false;
    12. }
    13. }
    14. return true;
    15. }
    16. }

            其他部分源码与分析与isNumeric()一脉相承。


    二、正则表达式

            StringUtils 的方法有自己的局限性,它只能判断正整数,其他的数字类型,如:负整数,浮点数...,使用正则表达式是常用的手段。

    • 预编译的正则写法
    1. // regexRule 是正则规则
    2. private static final Pattern pattern = Pattern.compile(regexRule);
    3. @Test
    4. void test_pattern(){
    5. Matcher mat = pattern.matcher("-123");
    6. System.out.println("正则匹配结果:" + mat);
    7. }
    • 数字有关的正则表达式
    说明正则表达式
    非负整数(正整数 + 0)^\d+$
    正整数^[0-9]*[1-9][0-9]*$
    非正整数(负整数 + 0)^((-\d+)|(0+))$
    负整数^-[0-9]*[1-9][0-9]*$
    浮点数^(-?\d+)(\.\d+)?$
    非负浮点数(正浮点数 + 0)^\d+(\.\d+)?$
    非正浮点数(负浮点数 + 0)^((-\d+(\.\d+)?)|(0+(\.0+)?))$
    ......

  • 相关阅读:
    Python超好用的命令行界面实现工具,我保证你肯定不知道...
    猿创征文|设计模式之享元模式的理解
    Snapdragon Profiler分析Android GPU
    [附源码]Python计算机毕业设计Django高校实验室仪器设备管理系统
    [附源码]Python计算机毕业设计Django旅游网的设计与实现
    2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书海口经济学院图书馆
    c语言练习74: 分割数组中数字的数位
    selinux权限添加总结
    [附源码]java毕业设计高校社团信息管理系统
    Java计算机网络篇-HTTPS
  • 原文地址:https://blog.csdn.net/weixin_44259720/article/details/127423304