1. ホーム

[解決済み】Javaで文字列が整数かどうか判断する【重複あり

2022-05-08 18:15:27

質問

<余談
この質問には、すでにここで回答があります :
クローズド 8年前 .

文字列の配列の中の特定の項目が整数であるかどうかを判断しようとしています。

私は .split(" ") の中にある infix 式を使用します。 String という形式にして、結果の配列を2つの配列に分割しようとしています。1つは整数用、もう1つは演算子用で、括弧やその他の雑多なものは破棄しています。これを実現する最善の方法は何でしょうか?

と思ったのですが Integer.isInteger(String arg) メソッドか何かで、そのようなことはありません。

解決方法は?

最も単純な方法は、文字列を繰り返し処理し、すべての要素が指定された基数に対して有効な数字であることを確認することです。これは、各要素を少なくとも一度は見なければならないので、可能な限り効率的な方法と言えます。基数に応じて最適化することも可能でしょうが、どう考えてもこの方法がベストでしょう。

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

あるいは、Java ライブラリに頼ることもできます。これは例外ベースではないので、思いつく限りのあらゆるエラー状態をキャッチすることができます。少しコストがかかりますが(Scannerオブジェクトを作成する必要があります。致命的にタイトなループではやりたくないでしょう)。しかし、一般的にはそれほど高くはないはずで、日常的な運用ではかなり信頼性が高いはずです。

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

ベストプラクティスはどうでもいいという方、コードレビューを担当する人をからかいたくなった方、ぜひ試してみてください。

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}