Как проверить, можно ли преобразовать строку в число типа double в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь определять, можно ли успешно преобразовать заданную строку в число с двойной точностью (double) в Java. Мы рассмотрим процесс попытки разбора строки с использованием метода Double.parseDouble(), узнаем, как обрабатывать потенциальные ошибки NumberFormatException, которые могут возникнуть, если строка не является допустимым числовым представлением, и обсудим методы проверки, соответствует ли строка допустимому десятичному формату. По завершении этого практического занятия вы получите знания, необходимые для безопасного и эффективного преобразования строк в числа с двойной точностью в своих Java-приложениях.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) 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{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} java/while_loop -.-> lab-559977{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} java/type_casting -.-> lab-559977{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} java/regex -.-> lab-559977{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} java/user_input -.-> lab-559977{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} java/exceptions -.-> lab-559977{{"Как проверить, можно ли преобразовать строку в число типа double в Java"}} end

Попытка разбора с использованием Double.parseDouble()

На этом этапе мы научимся преобразовывать строковое представление числа в числовой тип в Java. Это распространенная задача, когда вы получаете ввод от пользователя или читаете данные из файла, так как ввод обычно первоначально считывается как текст (строки).

Java предоставляет несколько способов выполнить такое преобразование. Одним из наиболее распространенных методов для преобразования строки в число с двойной точностью (double) является использование метода 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.

    Enter a decimal number: 123.45
    You entered: 123.45

    Программа должна успешно разобрать ваш ввод и вывести число обратно вам.

На этом этапе вы успешно использовали метод Double.parseDouble() для преобразования допустимого строкового представления десятичного числа в значение типа double. Однако что произойдет, если пользователь введет что-то, что не является допустимым числом? Мы рассмотрим это на следующем этапе.

Обработка NumberFormatException

На предыдущем этапе мы увидели, как работает метод Double.parseDouble(), когда входная строка представляет собой допустимое десятичное число. Но что произойдет, если пользователь введет текст, который не может быть преобразован в число? Давайте попробуем.

  1. Убедитесь, что вы находитесь в директории ~/project в Терминале.

  2. Запустите программу еще раз:

    java HelloJava
  3. Когда вас попросят ввести десятичное число, введите что-то, что явно не является числом, например hello или abc.

    Enter a decimal number: hello
  4. Нажмите Enter. В Терминале, скорее всего, появится много красного текста. Это сообщение об ошибке, а именно 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. Откройте файл HelloJava.java в редакторе WebIDE.

  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, делая свои программы более надежными и дружественными к пользователю.

Проверка на допустимый десятичный формат

На предыдущем этапе мы успешно обработали исключение NumberFormatException с помощью блока try-catch. Это предотвращает аварийное завершение нашей программы, когда ввод не является допустимым числом. Однако текущий подход по-прежнему пытается разобрать строку и перехватывает ошибку только после того, как разбор завершается неудачей.

Более активный подход - проверить, имеет ли входная строка допустимый десятичный формат перед попыткой ее разбора. Это можно сделать с помощью регулярных выражений или других методов валидации. В этом практическом занятии мы будем использовать простую проверку в цикле, чтобы неоднократно запрашивать у пользователя ввод до тех пор, пока не будет введено допустимое десятичное число.

Этот подход комбинирует блок try-catch с циклом, чтобы гарантировать получение допустимого ввода.

  1. Откройте файл HelloJava.java в редакторе WebIDE.

  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, который продолжается, пока validInput равно false.
    • Внутри блока try, если Double.parseDouble() завершается успешно, мы устанавливаем validInput в true. Это приведет к завершению цикла после текущей итерации.
    • Если возникает исключение NumberFormatException, выполняется блок catch, validInput остается равным false, и цикл продолжится, снова запрашивая у пользователя ввод.
    • После завершения цикла (то есть когда validInput равно true), мы выводим сообщение, подтверждающее, что был получен допустимый ввод.
  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() сможет успешно преобразовать.

Теперь вы реализовали базовый цикл валидации ввода, который гарантирует, что ваша программа получит от пользователя допустимое десятичное число перед продолжением выполнения. Это фундаментальный шаблон для обработки пользовательского ввода во многих приложениях.

Резюме

В этом практическом занятии мы научились проверять, можно ли преобразовать строку в число типа double в Java. Мы начали с попытки разбора строки в число типа double с помощью метода Double.parseDouble(). Этот метод является распространенным способом преобразования строковых представлений чисел в числовые типы, особенно полезным при обработке пользовательского ввода или данных, прочитанных из файлов. Мы реализовали простую Java-программу, которая запрашивает у пользователя ввод, считывает его как строку, а затем использует Double.parseDouble() для преобразования в число типа double, демонстрируя базовый процесс преобразования строки в число типа double.