专栏文章 如何判断字符串是不是数字

FunTester · 2025年04月24日 · 1165 次阅读

在编程的世界里,验证用户输入是否符合预期格式,是常见又必要的一环。一个常见的验证场景,就是检查某个字符串是否表示一个有效的数字。今天我们就来看看,如何用 Java 判断一个字符串是不是合法的数字格式。

笨办法

一个直接的方法是遍历字符串的每个字符,并确保所有字符都是数字(或者对于浮点数包含一个单点)。以下是代码示例:

package practice;

/**
 * FunTester 出品:用于验证字符串是否为有效数字的简单工具类
 */
public class Test {

    /**
     * 判断给定字符串是否是一个有效的数字。
     * 规则:仅允许一个小数点,其余必须为数字字符,不支持符号位或科学计数法。
     *
     * @param str 待验证的字符串
     * @return 如果是合法数字格式,返回 true;否则返回 false
     */
    public static boolean isValidNumber(String str) {
        if (str == null || str.isEmpty()) {
            return false; // 空字符串或 null 一律判为非法
        }

        boolean hasDecimalPoint = false; // 标记是否已经出现过小数点

        for (char ch : str.toCharArray()) {
            if (ch == '.') {
                if (hasDecimalPoint) {
                    return false; // 出现多个小数点,不合法
                }
                hasDecimalPoint = true; // 首次出现小数点,标记之
            } else if (!Character.isDigit(ch)) {
                return false; // 非数字字符,立即判定为非法
            }
        }

        return true; // 合法数字格式
    }

    public static void main(String[] args) {
        System.out.println("FunTester 数字格式校验开始:");
        System.out.println("输入: 123\t结果: " + isValidNumber("123"));         // true
        System.out.println("输入: 12.3\t结果: " + isValidNumber("12.3"));       // true
        System.out.println("输入: 12.3.4\t结果: " + isValidNumber("12.3.4"));   // false
        System.out.println("输入: abc\t结果: " + isValidNumber("abc"));         // false
    }
}

给定的 Java 代码演示了如何检查字符串是否是有效的数字表示。它使用了字符迭代和逻辑检查的组合。以下是代码的分解:

Test类包含一个静态方法isValidNumber,该方法接受一个字符串输入并返回一个布尔值,指示该字符串是否是有效的数字。首先,它检查字符串是否为null或空,如果是,则返回false

然后,该方法使用for-each循环遍历字符串的每个字符。一个标志变量hasDecimalPoint用于跟踪是否已经遇到过小数点。如果字符是小数点(‘.’),该方法检查是否已经见过;如果是,则返回false,因为在数字中多个小数点是无效的。如果字符不是数字且不是小数点,该方法立即返回false,表示存在无效字符。

如果字符串通过了所有这些检查,该方法返回true,确认输入是有效的数字表示。在main方法中,提供了几个测试用例来验证此逻辑:

  • "123":返回true,因为它是一个有效的整数。
  • "12.3":返回true,因为它是一个有效的小数。
  • "12.3.4":返回false,因为存在多个小数点。
  • "abc":返回false,因为它包含非数字字符。

这种方法是 Java 中验证数字字符串的一种简单且高效的方式,可以处理整数和小数,但不包括格式无效的数字。

执行代码时给出以下输出:

true
true
false
false

parseInt() 和 parseDouble()

Java 提供了像Integer.parseInt()Double.parseDouble()这样的方法来将字符串转换为数值。我们可以利用这些方法来验证字符串是否是数值。以下是代码示例:

package practice;

/**
 * FunTester 出品:使用 Java 标准解析方法判断字符串是否为合法的整数或小数
 */
public class Test {

    /**
     * 判断字符串是否为合法的整数
     *
     * @param str 输入字符串
     * @return 若能成功解析为 Integer,返回 true;否则返回 false
     */
    public static boolean isValidInteger(String str) {
        try {
            Integer.parseInt(str); // 尝试将字符串解析为整数
            return true;
        } catch (NumberFormatException e) {
            return false; // 出现格式错误,说明不是合法整数
        }
    }

    /**
     * 判断字符串是否为合法的小数(包括整数、小数、科学计数法等格式)
     *
     * @param str 输入字符串
     * @return 若能成功解析为 Double,返回 true;否则返回 false
     */
    public static boolean isValidDouble(String str) {
        try {
            Double.parseDouble(str); // 尝试将字符串解析为浮点数
            return true;
        } catch (NumberFormatException e) {
            return false; // 解析失败,说明不是合法小数
        }
    }

    public static void main(String[] args) {
        System.out.println("FunTester 数字合法性校验:");
        System.out.println("整数校验 - 输入: 123\t结果: " + isValidInteger("123"));     // true
        System.out.println("整数校验 - 输入: 12.3\t结果: " + isValidInteger("12.3"));   // false
        System.out.println("小数校验 - 输入: 12.3\t结果: " + isValidDouble("12.3"));    // true
        System.out.println("小数校验 - 输入: abc\t结果: " + isValidDouble("abc"));      // false
    }
}

提供的 Java 代码演示了如何验证字符串是否可以被解析为有效的整数或双精度浮点数。它包含两个方法,isValidIntegerisValidDouble,每个方法分别使用 Java 的内置解析方法Integer.parseIntDouble.parseDouble。以下是代码的详细解释:

isValidInteger方法接受一个字符串作为输入,并尝试使用Integer.parseInt将其解析为整数。如果字符串成功解析,则该方法返回true,表示该字符串表示一个有效的整数。如果发生NumberFormatException(当字符串不能被解析为整数时),该方法捕获异常并返回false,表示字符串不是有效的整数。

类似地,isValidDouble方法检查字符串是否可以被解析为有效的双精度浮点数,使用Double.parseDouble。如果字符串表示一个有效的双精度浮点数(例如小数),该方法返回true。如果解析失败导致NumberFormatException,它返回false

main方法中,执行了几个测试用例:

  • isValidInteger("123"):返回true,因为 “123” 是一个有效的整数。
  • isValidInteger("12.3"):返回false,因为 “12.3” 不是整数。
  • isValidDouble("12.3"):返回true,因为 “12.3” 是一个有效的双精度浮点数。
  • isValidDouble("abc"):返回false,因为 “abc” 不能被解析为数字。

这种方法有效地检查字符串是否可以被解释为有效的整数或双精度浮点数,通过捕获异常来处理字符串不表示有效数字的情况。

执行代码时给出以下输出:

true
false
true
false

BigDecimal

BigDecimal 类提供了精确的数值数据处理,特别适用于金融和科学计算。它也可以验证数值字符串。以下是代码示例:

package practice;

import java.math.BigDecimal;

/**
 * FunTester 出品:使用 BigDecimal 验证字符串是否为合法的数字格式
 */
public class Test {

    /**
     * 判断字符串是否可以被解析为 BigDecimal。
     * 支持整数、小数、科学计数法等格式。
     *
     * @param str 输入字符串
     * @return 若能成功构造 BigDecimal,返回 true;否则返回 false
     */
    public static boolean isValidBigDecimal(String str) {
        try {
            new BigDecimal(str); // BigDecimal 构造方法可解析多种数值格式
            return true;
        } catch (NumberFormatException e) {
            return false; // 非法格式会抛出异常
        }
    }

    public static void main(String[] args) {
        System.out.println("FunTester 精度数值校验:");
        System.out.println("输入: 123.45\t结果: " + isValidBigDecimal("123.45"));   // true
        System.out.println("输入: 1e10\t结果: " + isValidBigDecimal("1e10"));       // true
        System.out.println("输入: abc\t结果: " + isValidBigDecimal("abc"));         // false
    }
}

给定的 Java 代码演示了如何使用BigDecimal类检查字符串是否是有效的数字表示。Test类包含一个名为isValidBigDecimal的方法,该方法接受一个字符串作为输入并确定是否可以将其解析为有效的BigDecimal对象。

isValidBigDecimal方法尝试从提供的字符串创建一个新的BigDecimal。如果字符串是有效的数字,则成功创建BigDecimal对象,该方法返回true。如果字符串不能被解析为BigDecimal(例如,由于无效字符或格式不正确),则抛出NumberFormatException。在这种情况下,该方法捕获异常并返回false

main方法包括几个测试用例来验证功能:

  • isValidBigDecimal("123.45"):返回true,因为 “123.45” 是一个有效的BigDecimal,表示一个小数。
  • isValidBigDecimal("1e10"):返回true,因为 “1e10” 是一个有效的科学记数法,BigDecimal可以处理。
  • isValidBigDecimal("abc"):返回false,因为 “abc” 不能被解析为有效的BigDecimal

这种方法对于执行精确的数值验证非常有用,特别是在处理大数字或需要高精度时,BigDecimal类正是为此设计的。

执行代码时给出以下输出:

true
true
false

正则表达式

正则表达式提供了一种灵活的方式来验证数值字符串。以下模式检查整数、小数和科学记数法。以下是代码示例:

package practice;

import java.util.regex.Pattern;

/**
 * FunTester 出品:使用正则表达式判断字符串是否为合法的数字格式
 */
public class Test {

    /**
     * 使用正则表达式验证字符串是否为有效数字。
     * 支持整数、小数、正负号以及科学计数法(如 1e10、-2.5E-3)。
     *
     * @param str 输入字符串
     * @return 若匹配合法数字格式,返回 true;否则返回 false
     */
    public static boolean isValidRegex(String str) {
        // 正则解释:
        // ^[+-]?         :可选的正负号
        // \d*            :零个或多个数字(整数部分)
        // (\.\d+)?       :可选的小数点和至少一个小数位
        // ([eE][+-]?\d+)?:可选的科学计数法部分
        String regex = "^[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?$";
        return Pattern.matches(regex, str);
    }

    public static void main(String[] args) {
        System.out.println("FunTester 正则校验测试:");
        System.out.println("输入: 123\t结果: " + isValidRegex("123"));         // true
        System.out.println("输入: -12.3\t结果: " + isValidRegex("-12.3"));     // true
        System.out.println("输入: 1e10\t结果: " + isValidRegex("1e10"));       // true
        System.out.println("输入: abc\t结果: " + isValidRegex("abc"));         // false
    }
}

提供的 Java 代码演示了如何使用正则表达式(regex)来验证字符串是否表示有效的数字。Test类包含一个名为isValidRegex的方法,该方法使用正则表达式模式来检查字符串是否符合有效整数、小数或科学记数法的格式。

isValidRegex方法中,定义了一个正则表达式模式^[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?$。该模式解释如下:

  • ^[+-]?:可选地匹配字符串开头的加号或减号。
  • \\d*:匹配小数点前的零个或多个数字。
  • (\\.\\d+)?:可选地匹配小数点后的一个或多个数字,表示数字的小数部分。
  • ([eE][+-]?\\d+)?:可选地匹配 ‘e’ 或 ‘E’ 后跟可选的符号和一个或多个数字,允许科学记数法。
  • $:确保整个字符串从开始到结束都匹配该模式。

然后,该方法使用Pattern.matches(regex, str)来检查输入字符串是否匹配正则表达式模式。如果字符串匹配,则该方法返回true,表示有效数字。否则,返回false

main方法中,执行了几个测试用例来验证isValidRegex方法的功能:

  • isValidRegex("123"):返回true,因为 “123” 是一个有效的整数。
  • isValidRegex("-12.3"):返回true,因为 “-12.3” 是一个有效的小数。
  • isValidRegex("1e10"):返回true,因为 “1e10” 是一个有效的科学记数法数字。
  • isValidRegex("abc"):返回false,因为 “abc” 不是有效的数字。

这种方法对于验证各种格式的数值字符串非常有用,包括整数、小数和科学记数法,通过利用正则表达式的模式匹配功能。

执行代码时给出以下输出:

true
true
true
false

NumberUtils

Apache Commons Lang 库提供了一个方便的NumberUtils类,其中包含用于数字验证的方法。确保在您的 Maven 项目中添加以下依赖项以使用此库:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>your__jar__version</version>
</dependency>

以下是代码示例:

import org.apache.commons.lang3.math.NumberUtils;

/**
 * FunTester 出品:借助 Apache Commons Lang 工具类判断字符串是否为合法数字
 */
public class Test {

    /**
     * 使用 Apache Commons Lang 提供的 NumberUtils 工具方法,
     * 判断一个字符串是否可以被识别为合法的数值(整数、小数、十六进制、科学计数法等)。
     *
     * @param str 输入字符串
     * @return 如果字符串是可被识别的数字格式,返回 true;否则返回 false
     */
    public static boolean isValidNumberWithCommons(String str) {
        return NumberUtils.isCreatable(str); // 支持范围广泛,包含十进制、小数、科学计数法、十六进制等格式
    }

    public static void main(String[] args) {
        System.out.println("FunTester Commons 数值校验:");
        System.out.println("输入: 123\t结果: " + isValidNumberWithCommons("123"));       // true
        System.out.println("输入: -12.3\t结果: " + isValidNumberWithCommons("-12.3"));   // true
        System.out.println("输入: 1e10\t结果: " + isValidNumberWithCommons("1e10"));     // true
        System.out.println("输入: abc\t结果: " + isValidNumberWithCommons("abc"));       // false
    }
}

给定的 Java 代码演示了如何使用 Apache Commons Lang 库中的NumberUtils类来验证字符串是否是有效的数字。Test类包含一个名为isValidNumberWithCommons的方法,该方法利用NumberUtils中的isCreatable方法来确定字符串是否可以被解析为有效的数值。

isValidNumberWithCommons方法简单地调用NumberUtils.isCreatable(str),该方法检查输入字符串是否可以被解释为有效的数字。这包括整数、浮点数和科学记数法中的数字。如果字符串有效,则该方法返回true,否则返回false

main方法中,执行了几个测试用例:

  • isValidNumberWithCommons("123"):返回true,因为 “123” 是一个有效的整数。
  • isValidNumberWithCommons("-12.3"):返回true,因为 “-12.3” 是一个有效的小数。
  • isValidNumberWithCommons("1e10"):返回true,因为 “1e10” 是一个有效的科学记数法数字。
  • isValidNumberWithCommons("abc"):返回false,因为 “abc” 不是有效的数字。

当与 Apache Commons Lang 一起工作时,这种方法特别有用,因为它提供了一种简单可靠的方式来验证字符串作为数值,而无需实现自定义解析逻辑。isCreatable方法内部处理各种有效的数字格式,如整数、小数和科学记数法。

执行代码时给出以下输出:

true
true
true
false

结论

在编程实践中,验证字符串是否为数字的方式可谓五花八门,各有千秋。若只是简单判断,使用字符遍历或标准解析方法往往已经绰绰有余;当面对小数或科学记数法等复杂格式时,BigDecimal 的高精度能力或正则表达式的灵活匹配就更显威力。若倾向于使用第三方工具,Apache Commons 提供了开箱即用的实用方法,可谓省时省力。选择哪种方式,归根到底还要看实际场景与需求权衡——量体裁衣,方能事半功倍。

FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册