2016-03-22 8 views
0

私のアプリケーションはエンドユーザーから文字列として番号を取得します。数字が数字でない場合は、数字を入力するとエラーメッセージが表示されます。これはNumberFormatExceptionを使用して修正できます。もう1つのシナリオは、ユーザーがLong.MAX値より大きい値を入力した場合です。どのように私はこのケースをチェックし、Long.MAX値よりも小さい数値を入力するエラーメッセージをユーザーに与えることができますか?私はこの問題を解決するために第三者またはオープンソースのlibを使用すべきではありません。彼らが解決策を提供している場合でも、どのように解決していますか?NumberがLong.MAXの値よりも大きいかどうかを検出する方法

答えて

3

ユーザBigIntegerは、ユーザ入力を解析してはLong.MAX_VALUEと結果を比較する

String userInput = ...; 
BigInteger bigInt = new BigInteger(userInput); 
if(bigInt.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0) { 
    throw new Exception(userInput + ": value is too large"); 
} 
+0

はい。この解決策はうまくいきます。これはInteger/Long/Doubleの代わりにBigIntegerだけを使用できることを示していますか? BigIntegerを使うことができますか? –

+0

'Long'オブジェクトは' Long.MAX_VALUE'より大きい値を保持できませんので、入力を解析し、入力があなたの制限を満たすかどうかを検出するために 'BigInteger'を使用しなければなりません。その後、 'bigInt.longValue()'を呼び出して 'long'値を取得し、それをさらに処理します。 –

+0

誰も' 'throw new Exception(...)'をコードに書くべきではありません。代わりに、Exceptionのサブクラス(IllegalArgumentExceptionのような)を常に投げてください。 Throwing Exceptionは、例外を捕捉する他のコードを強制し、NullPointerExceptionsのようなプログラマーのエラーを見たり修正したりするのを防ぎます。 – VGR

1

入力した数値がLong.MAXより大きい場合は、次に何をしますか?どこに格納するか分からないと、エラーが発生します。

より良い方法は、ユーザー入力が範囲内にあるかどうかを確認することです。 Long.MAXより大きい場合は、BigInteger

+0

入力された値が範囲内にあるかどうかを確認する方法は? –

+0

私は@ Yaroslav Rudykhの答えが同じようにそれをしたと思います。 – FallAndLearn

+0

はい。それを試してみました。期待どおりに働く。ありがとう –

0

を使用してmax値にアクセスし、条件でユーザーが入力した値を確認できます。

+0

入力された入力が範囲内にあるかどうかをチェックするにはどうすればよいですか? –

0
ここ

あるJavaコア

public static void main(String[] args) { 
    System.out.println(isLargerThanLONGMAXVALUE("9223372036854775807"));  // false 
    System.out.println(isLargerThanLONGMAXVALUE("9223372036854775806"));  // false 
    System.out.println(isLargerThanLONGMAXVALUE("9223372036854775808"));  // true 
    System.out.println(isLargerThanLONGMAXVALUE("645459223372036854775807")); // true 
    System.out.println(isLargerThanLONGMAXVALUE("922"));      // false 
} 

public static boolean isLargerThanLONGMAXVALUE (String number) { 
    String longMax = String.valueOf(Long.MAX_VALUE); 
    if (number.length() > longMax.length()) return true; 
    if (number.length() < longMax.length()) return false; 
    long a, b = 0; 
    for (int i = 1 ; i < number.length() ; i++){ 
     a = Long.parseLong(number.substring(0, i)); 
     b = Long.parseLong(longMax.substring(0, i)); 
     if (a > b) return true; 
    } 
    if (Integer.parseInt(number.substring(number.length()-1, number.length())) > 
     Integer.parseInt(longMax.substring(number.length()-1, number.length()))) 
     return true; 
    return false; 
} 
0

として文字列を扱う以外の余分なクラスを使用せずに別の溶液BigIntegerと比較を行うのが最善の方法です。

public boolean isInRange(String number) { 
    String maxValue = Long.toString(Long.MAX_VALUE); 
    number = number.replaceFirst("^0+", ""); // remove leading zeroes 
    return number.length() < maxValue.length() || 
      (number.length() == maxValue.length() && 
      number.compareTo(maxValue) <= 0); 
} 

これはnumberが完全桁の(負符号)で構成されていないことを前提としています。しかし、ここでもう一つは、ちょうど何かを達成するために、通常は複数の方法があることを示すことです。

1

使用BigIntegerlongValueExact()方法、およびキャッチ例外:

public static void main(String[] args) { 
    test("123"); 
    test("9223372036854775807"); // Long.MAX_VALUE 
    test("-9223372036854775808"); // Long.MIN_VALUE 
    test("9223372036854775808"); // Long.MAX_VALUE + 1 
    test("-9223372036854775809"); // Long.MIN_VALUE - 1 
    test("abc"); 
} 
private static void test(String input) { 
    long longVal; 
    try { 
     longVal = new BigInteger(input).longValueExact(); 
    } catch (NumberFormatException e) { 
     System.out.println("Value is not a valid integer number: " + input); 
     return; 
    } catch (ArithmeticException e) { 
     System.out.println("Value exceeds range of long: " + input); 
     return; 
    } 
    System.out.println("Got valid long value: " + longVal); 
} 

OUTPUT

Got valid long value: 123 
Got valid long value: 9223372036854775807 
Got valid long value: -9223372036854775808 
Value exceeds range of long: 9223372036854775808 
Value exceeds range of long: -9223372036854775809 
Value is not a valid integer number: abc 
+0

このソリューションも期待どおりに機能します。すばらしいです。しかし、どちらがパフォーマンス/メモリによって優れていますか? 1. long.MAX argまたは2. longValueExactメソッドを使用したcompareToメソッド –

関連する問題