Java で文字列が double 型に変換できるかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で与えられた文字列が倍精度浮動小数点数に正常に変換できるかどうかを判断する方法を学びます。Double.parseDouble() を使用して文字列を解析するプロセスを調査し、文字列が有効な数値表現でない場合に発生する可能性のある NumberFormatException エラーを処理する方法を理解し、文字列が有効な 10 進数形式に準拠しているかどうかをチェックする方法について説明します。この実験の終わりまでに、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{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} java/while_loop -.-> lab-559977{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} java/type_casting -.-> lab-559977{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} java/regex -.-> lab-559977{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} java/user_input -.-> lab-559977{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} java/exceptions -.-> lab-559977{{"Java で文字列が double 型に変換できるかどうかをチェックする方法"}} end

Double.parseDouble() を使用した解析の試行

このステップでは、Java で数値の文字列表現を数値型に変換する方法を学びます。ユーザーからの入力を受け取ったり、ファイルからデータを読み取ったりする際に、入力は最初はテキスト(文字列)として読み取られることが多いため、これは一般的なタスクです。

Java にはこの変換を行ういくつかの方法が用意されています。文字列から倍精度浮動小数点数に変換する最も一般的な方法の 1 つは、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();
    
            // 入力文字列を double 型に解析しようと試みる
            double number = Double.parseDouble(userInput);
    
            System.out.println("You entered: " + number);
    
            scanner.close();
        }
    }

    このコードの新しい部分を見てみましょう。

    • System.out.print("Enter a decimal number: ");:この行は、ユーザーに 10 進数の入力を促します。
    • String userInput = scanner.nextLine();:これはユーザーの入力を文字列として読み取り、userInput 変数に格納します。
    • double number = Double.parseDouble(userInput);:これがこのステップの核心です。Double.parseDouble()userInput 文字列を受け取り、それを double 値に変換しようと試みます。文字列が 10 進数として正常に解釈できる場合、結果の double 値は number 変数に格納されます。
    • System.out.println("You entered: " + number);:この行は、解析された double 値をユーザーに表示します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、修正したプログラムをコンパイルします。WebIDE の下部にあるターミナルを開き、~/project ディレクトリにいることを確認してから、次のコマンドを実行します。

    javac HelloJava.java

    コンパイルが成功すると、何も出力されません。

  5. 最後に、プログラムを実行します。

    java HelloJava
  6. プログラムは、10 進数の入力を求めるメッセージを表示します。123.45 のような有効な 10 進数を入力し、Enter キーを押します。

    Enter a decimal number: 123.45
    You entered: 123.45

    プログラムは入力を正常に解析し、その数値を表示するはずです。

このステップでは、Double.parseDouble() を使用して、10 進数の有効な文字列表現を double 型に正常に変換しました。しかし、ユーザーが有効な数値ではないものを入力した場合はどうなるでしょうか?次のステップでこれを調べます。

NumberFormatException の処理

前のステップでは、入力文字列が有効な 10 進数である場合の Double.parseDouble() の動作を見ました。では、ユーザーが数値に変換できないテキストを入力した場合はどうなるでしょうか?試してみましょう。

  1. ターミナルで ~/project ディレクトリにいることを確認します。

  2. プログラムを再度実行します。

    java HelloJava
  3. 10 進数の入力を求められたら、helloabc のような明らかに数値ではないものを入力します。

    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 を処理するようにプログラムを修正しましょう。

  5. WebIDE エディタで HelloJava.java ファイルを開きます。

  6. 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 {
                // 入力文字列を double 型に解析しようと試みる
                double number = Double.parseDouble(userInput);
                System.out.println("You entered: " + number);
            } catch (NumberFormatException e) {
                // NumberFormatException が発生した場合、このコードが実行される
                System.out.println("Invalid input. Please enter a valid decimal number.");
            }
    
            scanner.close();
        }
    }

    この更新されたコードでは、

    • Double.parseDouble(userInput); 行は try ブロックの中にあります。
    • catch (NumberFormatException e) ブロックは、try ブロック内で NumberFormatException が発生した場合、catch ブロック内のコードを実行することを指定しています。
    • catch ブロック内では、プログラムをクラッシュさせる代わりに、ユーザーに分かりやすいエラーメッセージを表示します。
  7. ファイルを保存します(Ctrl+S または Cmd+S)。

  8. 修正したプログラムをコンパイルします。

    javac HelloJava.java
  9. プログラムを再度実行します。

    java HelloJava
  10. 入力を求められたら、再び hello のような無効な入力を入力します。

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

    今回は、プログラムはクラッシュする代わりに NumberFormatException を捕捉し、catch ブロックからのメッセージを表示しました。これははるかに良いユーザー体験です!

これで、try-catch ブロックを使用して NumberFormatException のような例外を処理する方法を学びました。これにより、プログラムをより堅牢でユーザーフレンドリーにすることができます。

有効な 10 進数形式のチェック

前のステップでは、try-catch ブロックを使用して NumberFormatException を正常に処理しました。これにより、入力が有効な数値でない場合にプログラムがクラッシュするのを防ぎます。ただし、現在のアプローチでは、文字列の解析を試み、解析に失敗した でエラーを捕捉するだけです。

より積極的なアプローチは、解析を試みる に入力文字列が有効な 10 進数形式かどうかをチェックすることです。これは正規表現やその他の検証手法を使って行うことができます。この実験では、ループ内で簡単なチェックを行い、有効な 10 進数が入力されるまでユーザーに入力を繰り返し求めます。

このアプローチでは、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; // デフォルト値で初期化
            boolean validInput = false; // 有効な入力を追跡するフラグ
    
            while (!validInput) {
                System.out.print("Enter a decimal number: ");
                String userInput = scanner.nextLine();
    
                try {
                    // 入力文字列を double 型に解析しようと試みる
                    number = Double.parseDouble(userInput);
                    validInput = true; // 解析が成功した場合はフラグを true に設定
                } catch (NumberFormatException e) {
                    // NumberFormatException が発生した場合、このコードが実行される
                    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)validInputfalse の間、while ループが続きます。
    • try ブロック内で、Double.parseDouble() が成功した場合、validInputtrue に設定します。これにより、現在の反復処理の後にループが終了します。
    • NumberFormatException が発生した場合、catch ブロックが実行され、validInputfalse のままで、ループが続き、ユーザーに再度入力を求めます。
    • ループが終了した後(つまり validInputtrue の場合)、有効な入力が受け取られたことを確認するメッセージを表示します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 修正したプログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava
  6. まず無効な入力を試してから、有効な 10 進数を入力してみましょう。

    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() が正常に変換できる文字列を入力するまで、入力を求め続けます。

これで、プログラムがユーザーから有効な 10 進数を受け取るまで入力を続ける基本的な入力検証ループを実装しました。これは、多くのアプリケーションでユーザー入力を処理するための基本的なパターンです。

まとめ

この実験では、Java で文字列が double 型に変換できるかどうかをチェックする方法を学びました。まず、Double.parseDouble() メソッドを使用して文字列を double 型に解析する試みを行いました。このメソッドは、数値の文字列表現を数値型に変換する一般的な方法であり、ユーザー入力やファイルから読み取ったデータを扱う際に特に有用です。ユーザーに入力を求め、それを文字列として読み取り、Double.parseDouble() を使用して double 型に変換する簡単な Java プログラムを実装し、文字列から double 型への基本的な変換プロセスを実証しました。