如何在 Java 中检查字符串是否为数字

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习在 Java 中检查给定字符串是否表示数值的不同方法。我们将首先探讨如何尝试将字符串解析为整数,并处理字符串不是有效数字时可能出现的错误。

接下来,你将了解如何利用正则表达式的强大功能进行更灵活、更可靠的数值检查。最后,我们将拓展知识,以处理表示负数和小数值的字符串,确保我们的数值检查全面无遗漏。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/StringManipulationGroup -.-> java/strings("Strings") java/StringManipulationGroup -.-> java/regex("RegEx") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/data_types -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/operators -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/if_else -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/strings -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/regex -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/exceptions -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} java/string_methods -.-> lab-559989{{"如何在 Java 中检查字符串是否为数字"}} end

尝试将字符串解析为整数

在这一步中,我们将探讨如何在 Java 中将字符串(文本)转换为整数(一个完整的数字)。这是编程中的常见任务,特别是当你需要从用户那里获取数值输入或从文件中读取数字时。

Java 提供了一种内置的方法来实现这一点,即使用 Integer.parseInt() 方法。但是,如果字符串实际上并不表示一个有效的数字,会发生什么呢?让我们通过编写一个简单的 Java 程序来一探究竟。

  1. 如果 HelloJava.java 文件尚未在 WebIDE 编辑器中打开,请打开它。

  2. 将文件的全部内容替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            String numberString = "123";
            int number = Integer.parseInt(numberString);
            System.out.println("Successfully parsed: " + number);
    
            String invalidString = "abc";
            try {
                int invalidNumber = Integer.parseInt(invalidString);
                System.out.println("This line will not be reached.");
            } catch (NumberFormatException e) {
                System.out.println("Error: Could not parse '" + invalidString + "' to an integer.");
                System.out.println("Exception details: " + e.getMessage());
            }
        }
    }

    让我们来看看这段代码的新部分:

    • String numberString = "123";:我们创建了一个字符串变量 numberString,并将其赋值为 "123"
    • int number = Integer.parseInt(numberString);:这是转换的核心。Integer.parseInt() 尝试将字符串 "123" 转换为整数。由于 "123" 是一个有效的整数表示,这将成功,并且整数值 123 将存储在 number 变量中。
    • String invalidString = "abc";:我们创建了另一个字符串变量 invalidString,并将其赋值为 "abc"。这个字符串并不表示一个有效的整数。
    • try { ... } catch (NumberFormatException e) { ... }:这是一个 try-catch 块,用于处理 Java 中的错误(异常)。
      • try 块内的代码是我们放置可能导致错误的操作的地方。在这种情况下,是 Integer.parseInt(invalidString)
      • 如果 Integer.parseInt("abc") 失败,因为 "abc" 不是一个有效的数字,它将“抛出”一个 NumberFormatException
      • catch (NumberFormatException e) 块“捕获”这种特定类型的异常。然后,catch 块内的代码将被执行。
    • System.out.println("Error: Could not parse '" + invalidString + "' to an integer.");:如果发生 NumberFormatException,将打印这一行。
    • System.out.println("Exception details: " + e.getMessage());:这将打印由异常对象 e 提供的关于错误的更具体的消息。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译程序:

    javac HelloJava.java

    如果没有错误,你将看不到任何输出。

  5. 运行编译后的程序:

    java HelloJava

    你应该会看到类似于以下的输出:

    Successfully parsed: 123
    Error: Could not parse 'abc' to an integer.
    Exception details: For input string: "abc"

    这个输出表明,第一次解析尝试成功了,但第二次使用无效字符串 "abc" 的尝试导致了 NumberFormatException,并且我们的 catch 块通过打印错误消息优雅地处理了这个异常。

这展示了在将字符串转换为数字时处理潜在错误的重要性,因为并非所有字符串都能成功解析。在 Java 中,使用 try-catch 块是处理此类情况的标准方法。

使用正则表达式进行数值检查

在上一步中,我们了解到如果字符串不是有效的整数,Integer.parseInt() 会抛出异常。虽然 try-catch 块在错误发生时有助于处理错误,但有时你可能希望在尝试转换之前先检查字符串是否“可以”被解析为数字。这时,正则表达式(Regular Expressions,简称 Regex)就派上用场了。

正则表达式是用于匹配字符串中字符组合的强大模式。我们可以使用一个简单的正则表达式模式来检查字符串是否仅由数字组成。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将文件的全部内容替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            String numberString = "123";
            String invalidString = "abc";
            String mixedString = "123a";
    
            System.out.println("Checking string: \"" + numberString + "\"");
            if (numberString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
                int number = Integer.parseInt(numberString);
                System.out.println("  Parsed integer: " + number);
            } else {
                System.out.println("  Does not match the pattern.");
            }
    
            System.out.println("\nChecking string: \"" + invalidString + "\"");
            if (invalidString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
            } else {
                System.out.println("  Does not match the pattern.");
            }
    
            System.out.println("\nChecking string: \"" + mixedString + "\"");
            if (mixedString.matches("\\d+")) {
                System.out.println("  Matches the pattern (contains only digits).");
            } else {
                System.out.println("  Does not match the pattern.");
            }
        }
    }

    让我们来详细分析新添加的部分:

    • numberString.matches("\\d+"):这是关键部分。matches() 方法是 Java 中所有字符串对象都具备的方法,它用于检查整个字符串是否与给定的正则表达式模式匹配。
    • "\\d+":这就是正则表达式模式。
      • \\d:它用于匹配任何数字(0 到 9)。这里使用 \\ 是因为在 Java 字符串中,\ 是特殊字符,所以需要进行转义。
      • +:这是一个量词,表示前面的元素出现“一次或多次”。因此,\\d+ 表示“一个或多个数字”。
    • if 语句会检查 matches() 方法的返回结果。如果返回 true,则表示字符串完全由一个或多个数字组成;如果返回 false,则表示字符串包含非数字字符或者为空。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译程序:

    javac HelloJava.java

    如果编译成功,你将看不到任何输出。

  5. 运行编译后的程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Checking string: "123"
      Matches the pattern (contains only digits).
      Parsed integer: 123
    
    Checking string: "abc"
      Does not match the pattern.
    
    Checking string: "123a"
      Does not match the pattern.

    正如你所见,matches("\\d+") 检查正确地识别出 "123" 仅包含数字,而 "abc""123a" 不匹配该模式。这种方法使你能够在尝试解析字符串之前验证其格式,在某些情况下可能避免 NumberFormatException 的发生。

处理负数和小数

在前面的步骤中,我们主要关注解析正整数。然而,数字也可以是负数或带有小数点。在这一步,我们将学习在 Java 中把字符串转换为数字时如何处理这些情况。

Java 为解析不同类型的数字提供了不同的方法:

  • Integer.parseInt():用于解析整数(whole numbers)。
  • Double.parseDouble():用于解析带小数点的数字(浮点数,floating - point numbers)。

让我们修改程序以处理负整数和小数。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 将文件的全部内容替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            String positiveIntString = "456";
            String negativeIntString = "-789";
            String decimalString = "123.45";
            String invalidString = "not a number";
    
            // Handling Integers (positive and negative)
            System.out.println("Attempting to parse integers:");
            try {
                int positiveInt = Integer.parseInt(positiveIntString);
                System.out.println("  Parsed '" + positiveIntString + "' as integer: " + positiveInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + positiveIntString + "' as integer.");
            }
    
            try {
                int negativeInt = Integer.parseInt(negativeIntString);
                System.out.println("  Parsed '" + negativeIntString + "' as integer: " + negativeInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + negativeIntString + "' as integer.");
            }
    
            try {
                int decimalAsInt = Integer.parseInt(decimalString);
                System.out.println("  Parsed '" + decimalString + "' as integer: " + decimalAsInt);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + decimalString + "' as integer.");
            }
    
            // Handling Decimal Numbers
            System.out.println("\nAttempting to parse decimal numbers:");
            try {
                double decimal = Double.parseDouble(decimalString);
                System.out.println("  Parsed '" + decimalString + "' as double: " + decimal);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + decimalString + "' as double.");
            }
    
            try {
                double intAsDouble = Double.parseDouble(positiveIntString);
                System.out.println("  Parsed '" + positiveIntString + "' as double: " + intAsDouble);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + positiveIntString + "' as double.");
            }
    
             try {
                double invalidAsDouble = Double.parseDouble(invalidString);
                System.out.println("  Parsed '" + invalidString + "' as double: " + invalidAsDouble);
            } catch (NumberFormatException e) {
                System.out.println("  Could not parse '" + invalidString + "' as double.");
            }
        }
    }

    下面是代码的执行逻辑:

    • 我们现在有分别代表正整数、负整数、小数和无效字符串的几个字符串。
    • 我们在 try - catch 块中使用 Integer.parseInt() 尝试将字符串解析为整数。注意,Integer.parseInt() 可以处理负号(-)。但是,如果字符串包含小数点或非数字字符,它将抛出 NumberFormatException
    • 我们在 try - catch 块中使用 Double.parseDouble() 尝试将字符串解析为小数(双精度浮点数,doubles)。Double.parseDouble() 可以处理整数和带小数点的数字。对于不是有效双精度浮点数表示的字符串,它将抛出 NumberFormatException
  3. 保存文件(Ctrl + S 或 Cmd + S)。

  4. 在终端中编译程序:

    javac HelloJava.java

    如果编译成功,你将看不到任何输出。

  5. 运行编译后的程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Attempting to parse integers:
      Parsed '456' as integer: 456
      Parsed '-789' as integer: -789
      Could not parse '123.45' as integer.
    
    Attempting to parse decimal numbers:
      Parsed '123.45' as double: 123.45
      Parsed '456' as double: 456.0
      Could not parse 'not a number' as double.

    这个输出表明,Integer.parseInt() 正确解析了正整数和负整数,但在处理小数字符串时失败了。Double.parseDouble() 成功解析了小数字符串和整数字符串(将整数表示为双精度浮点数,例如 456.0),但在处理无效字符串时失败了。

这一步展示了如何针对不同的数字类型使用合适的解析方法,同时强调了在输入字符串可能不符合预期格式时,使用 try - catch 块处理潜在的 NumberFormatException 错误的重要性。

总结

在本次实验中,我们学习了如何在 Java 中检查一个字符串是否为数字。首先,我们探讨了使用 Integer.parseInt() 方法尝试将字符串解析为整数,了解到如果字符串不是有效的整数表示形式,该方法会抛出 NumberFormatException 异常。我们还学习了如何使用 try - catch 块来处理这个异常,从而优雅地处理非数字字符串。

在此基础上,我们接着学习了如何使用正则表达式作为一种更灵活的方法来检查数字字符串,它可以处理各种格式。最后,我们进一步拓展了知识,学会了在判断字符串是否表示数值时,如何处理负数和小数。