web-dev-qa-db-ja.com

文字列がJavaの整数かどうかを判別

私は文字列の配列内の特定の項目が整数かどうかを判断しようとしています。

.split(" ")'ingString形式の中置式で、結果の配列を2つの配列に分割しようとしています。 1つは整数用、1つは演算子用、もう1つは括弧の破棄、その他の雑多な項目です。これを達成するための最善の方法は何でしょうか。

私はInteger.isInteger(String arg)メソッドか何かを見つけることができるかもしれないと思いました、しかしそのような運はありません。

274
Nick Coelius

最も単純な方法は、Stringを反復処理し、すべての要素が特定の基数に対して有効な数字であることを確認することです。各要素を少なくとも一度は見なければならないので、これは可能な限り効率的です。基数に基づいてそれをマイクロ最適化することができると思いますが、すべての意図と目的のためにこれはあなたが得ることが期待できるのと同じくらい良いです。

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;
}
319
corsiKa

正規表現を使うほうが良いです。

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

代わりにif-statementを使用できる場合は、ここでNumberFormatExceptionを使用するのはよくありません。


先頭にゼロを付けたくない場合は、次のように正規表現を使用します。

str.matches("-?(0|[1-9]\\d*)");
226
shuangwhywhy

あるいは、Apache Commonsの親友からのちょっとした助けを借りることもできます。 StringUtils.isNumeric(String str)

132
Will Madison

あるいは単に

mystring.matches("\\d+")

intよりも大きい数に対してはtrueを返しますが

66
claus437

Integer.parseInt(String) メソッドを使用します。

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}
48
Mike Lewis

文字列を解析してNumberFormatExceptionをキャッチする代わりに、正規表現を使用することもできます。例えば.

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

特に、正規表現をプリコンパイルして再利用する場合は、これが速くなる可能性があります。ただし、strが有効なint値の範囲外の数値を表している場合でも、Integer.parseInt(str)は失敗します。

13
Stephen C

文字列が有効な整数ではない場合は、Integer.parseInt(str)を使用してNumberFormatExceptionをキャッチできます。

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

ただし、評価された整数がオーバーフローすると、同じ例外がスローされることに注意してください。あなたの目的は、それが有効な整数かどうかを調べることでした。そのため、妥当性をチェックするための独自の方法を作る方が安全です。

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}
8
Rushil Paul

文字列から整数を取得するためにInteger.parseInt()またはInteger.valueOf()を使用することができ、それが解析可能なintでない場合は例外をキャッチします。あなたはそれが投げることができるNumberFormatExceptionを必ずキャッチしたいです。

ValueOf()はプリミティブintではなくIntegerオブジェクトを返すことに注意してください。

1
Chad La Guardia