如何在 Java 中检查字符串是否可以转换为双精度浮点数

JavaJavaBeginner
立即练习

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

简介

在这个实验中,你将学习如何判断一个给定的字符串能否在 Java 中成功转换为双精度浮点数。我们将探讨使用 Double.parseDouble() 方法尝试解析字符串的过程,了解如何处理当字符串不是有效的数字表示形式时可能出现的 NumberFormatException 错误,并讨论检查字符串是否符合有效十进制格式的方法。完成本实验后,你将掌握在 Java 应用程序中安全、有效地将字符串转换为双精度浮点数的知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/while_loop("While Loop") java/BasicSyntaxGroup -.-> java/type_casting("Type Casting") java/StringManipulationGroup -.-> java/regex("RegEx") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") subgraph Lab Skills java/data_types -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} java/while_loop -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} java/type_casting -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} java/regex -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} java/user_input -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} java/exceptions -.-> lab-559977{{"如何在 Java 中检查字符串是否可以转换为双精度浮点数"}} end

使用 Double.parseDouble() 尝试解析

在这一步中,你将学习如何在 Java 中将数字的字符串表示形式转换为数值类型。当你从用户那里获取输入或从文件中读取数据时,这是一项常见的任务,因为输入通常最初是以文本(字符串)形式读取的。

Java 提供了多种方法来执行这种转换。将字符串转换为双精度浮点数最常用的方法之一是使用 Double.parseDouble() 方法。

让我们创建一个简单的 Java 程序来演示这一点。

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

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

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter a decimal number: ");
            String userInput = scanner.nextLine();
    
            // Attempt to parse the input string into a double
            double number = Double.parseDouble(userInput);
    
            System.out.println("You entered: " + number);
    
            scanner.close();
        }
    }

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

    • System.out.print("Enter a decimal number: ");:这行代码提示用户输入一个十进制数。
    • String userInput = scanner.nextLine();:这行代码将用户的输入作为字符串读取,并将其存储在 userInput 变量中。
    • double number = Double.parseDouble(userInput);:这是这一步的核心。Double.parseDouble() 方法接受 userInput 字符串,并尝试将其转换为 double 类型的值。如果该字符串可以成功解释为十进制数,则得到的 double 值将存储在 number 变量中。
    • System.out.println("You entered: " + number);:这行代码将解析后的 double 值打印回给用户。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 现在,编译修改后的程序。打开 WebIDE 底部的终端,并确保你位于 ~/project 目录中。然后运行以下命令:

    javac HelloJava.java

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

  5. 最后,运行程序:

    java HelloJava
  6. 程序将提示你输入一个十进制数。输入一个有效的十进制数,例如 123.45,然后按回车键。

    Enter a decimal number: 123.45
    You entered: 123.45

    程序应该能够成功解析你的输入并将数字打印回给你。

在这一步中,你已经成功使用 Double.parseDouble() 将有效的十进制数字符串表示形式转换为 double 类型。但是,如果用户输入的不是有效的数字,会发生什么呢?我们将在下一步中探讨这个问题。

处理 NumberFormatException

在上一步中,我们了解了当输入字符串是有效的十进制数时,Double.parseDouble() 是如何工作的。但如果用户输入的文本无法转换为数字,会发生什么呢?让我们来试试看。

  1. 确保你在终端中处于 ~/project 目录。

  2. 再次运行程序:

    java HelloJava
  3. 当提示你输入一个十进制数时,输入明显不是数字的内容,比如 helloabc

    Enter a decimal number: hello
  4. 按下回车键。你可能会在终端中看到很多红色文本。这是一条错误消息,具体来说是 NumberFormatException

    Exception in thread "main" java.lang.NumberFormatException: For input string: "hello"
        at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2050)
        at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
        at java.base/java.lang.Double.parseDouble(Double.java:651)
        at HelloJava.main(HelloJava.java:10)

    之所以会出现这个 NumberFormatException,是因为字符串 "hello" 无法被解析为有效的 double 值。当发生这样的异常且没有被处理时,程序会崩溃并停止执行。

    在实际应用中,你不希望程序仅仅因为用户输入了无效内容就崩溃。你需要一种方法来优雅地处理这类错误。在 Java 中,我们使用 try-catch 块来处理异常。

    try-catch 块的工作原理如下:

    • 可能引发异常的代码放在 try 块中。
    • 如果 try 块中发生异常,catch 块中的代码将被执行。
    • 如果没有发生异常,catch 块将被跳过。

让我们修改程序,使用 try-catch 块来处理 NumberFormatException

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

  2. 修改代码,将 Double.parseDouble() 调用包裹在 try-catch 块中:

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter a decimal number: ");
            String userInput = scanner.nextLine();
    
            try {
                // Attempt to parse the input string into a double
                double number = Double.parseDouble(userInput);
                System.out.println("You entered: " + number);
            } catch (NumberFormatException e) {
                // This code runs if a NumberFormatException occurs
                System.out.println("Invalid input. Please enter a valid decimal number.");
            }
    
            scanner.close();
        }
    }

    在这个更新后的代码中:

    • Double.parseDouble(userInput); 这一行位于 try 块内。
    • catch (NumberFormatException e) 块指定,如果 try 块中发生 NumberFormatException,则执行 catch 块中的代码。
    • catch 块中,我们打印了一条用户友好的错误消息,而不是让程序崩溃。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 编译修改后的程序:

    javac HelloJava.java
  5. 再次运行程序:

    java HelloJava
  6. 当提示输入时,再次输入像 hello 这样的无效输入。

    Enter a decimal number: hello
    Invalid input. Please enter a valid decimal number.

    这次,程序没有崩溃,而是捕获了 NumberFormatException 并打印了 catch 块中的消息。这是一种更好的用户体验!

你现在已经学会了如何使用 try-catch 块来处理像 NumberFormatException 这样的异常,让你的程序更加健壮和用户友好。

检查有效的十进制格式

在上一步中,我们使用 try-catch 块成功处理了 NumberFormatException。这避免了在输入不是有效数字时程序崩溃。然而,当前的方法仍然会尝试解析字符串,并且仅在解析失败 之后 才捕获错误。

一种更主动的方法是在尝试解析输入字符串之前,检查它是否具有有效的十进制格式。这可以通过正则表达式或其他验证技术来实现。在这个实验中,我们将在循环中进行简单的检查,不断要求用户输入,直到提供有效的十进制数为止。

这种方法将 try-catch 块与循环结合起来,以确保获得有效的输入。

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

  2. 修改代码,加入一个循环,持续运行直到接收到有效的输入:

    import java.util.Scanner;
    
    public class HelloJava {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            double number = 0.0; // Initialize with a default value
            boolean validInput = false; // Flag to track valid input
    
            while (!validInput) {
                System.out.print("Enter a decimal number: ");
                String userInput = scanner.nextLine();
    
                try {
                    // Attempt to parse the input string into a double
                    number = Double.parseDouble(userInput);
                    validInput = true; // Set flag to true if parsing is successful
                } catch (NumberFormatException e) {
                    // This code runs if a NumberFormatException occurs
                    System.out.println("Invalid input. Please enter a valid decimal number.");
                }
            }
    
            System.out.println("You entered a valid number: " + number);
    
            scanner.close();
        }
    }

    让我们看看这些更改:

    • double number = 0.0;:我们在循环外部初始化 number 变量。
    • boolean validInput = false;:我们引入一个布尔变量 validInput 来控制循环。它最初为 false
    • while (!validInput):这创建了一个 while 循环,只要 validInputfalse 就会继续运行。
    • try 块内部,如果 Double.parseDouble() 成功,我们将 validInput 设置为 true。这将导致循环在当前迭代后终止。
    • 如果发生 NumberFormatException,则执行 catch 块,validInput 保持为 false,循环将继续,再次提示用户输入。
    • 循环结束后(即 validInputtrue),我们打印一条消息,确认接收到了有效的输入。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 编译修改后的程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava
  6. 现在,先尝试输入无效的输入,然后输入一个有效的十进制数。

    Enter a decimal number: abc
    Invalid input. Please enter a valid decimal number.
    Enter a decimal number: 1.2.3
    Invalid input. Please enter a valid decimal number.
    Enter a decimal number: 789.01
    You entered a valid number: 789.01

    程序将持续要求输入,直到你提供一个 Double.parseDouble() 能够成功转换的字符串。

你现在已经实现了一个基本的输入验证循环,确保程序在继续执行之前从用户那里接收到有效的十进制数。这是许多应用程序中处理用户输入的基本模式。

总结

在这个实验中,我们学习了如何检查一个字符串在 Java 中是否可以转换为双精度浮点数(double)。我们首先尝试使用 Double.parseDouble() 方法将字符串解析为双精度浮点数。该方法是将数字的字符串表示形式转换为数值类型的常用方法,在处理用户输入或从文件中读取的数据时特别有用。我们实现了一个简单的 Java 程序,该程序提示用户输入,将输入读取为字符串,然后使用 Double.parseDouble() 将其转换为双精度浮点数,展示了字符串到双精度浮点数转换的基本过程。