2016-10-29 39 views
2

鑑於String表示int,我想檢查溢出。鑑於int的字符串表示形式,檢查溢出

我知道如何使用java的內置函數parseInt來轉換Stringint。 但是如果String太大以至於不適合int會怎樣?

String str = "214748364781"; 
int res = Integer.parseInt(str); 

我試圖檢查String代表性的符號,做parseInt如果符號不匹配,那麼我可以說,它溢出,因爲int迴繞但是當我居然跑它,它扔了NumberFormat例外。

NumberFormat對任何錯誤格式化的字符串都會引發,所以它不能保證溢出。

所以我可以檢查出輸入字符串的格式是正確的(所有數字),然後做parseInt那麼,如果我得到NumberFormat我可以得出這樣的結論錯誤的,由於溢出。

但是,我覺得應該有一個更短的方式來做這個檢查。

回答

1

只是爲了給你一個不同的選擇,如果你想要做的就是檢查你的字符串是否會溢出你可以按字典順序進行比較。字符串比較通常比解析數字要快得多。

假設只有正整數。

String number = "2147483649"; 
    String int_max = "2147483647"; 

    if (number.length() > int_max.length()) 
    { 
     System.out.println("OVERFLOW"); 
    } 
    else if (number.length() == int_max.length()){ 
     int comparison = number.compareTo(int_max); 
     System.out.println(comparison > 0 ? "OVERFLOW" : ""); 
    } 

如今,在真實的生活場景,如果你有可能有大的整數,你應該用一個較長或BigInteger的在其他的答案建議。

希望這會有所幫助。

2

解析它爲Long,如果它解析爲Integer,如果它拋出並在該點的異常,它溢出。

OR

解析它作爲一個Long,並檢查它是否大於Integer.MAX_VALUE

2

你可以解析它作爲一個BigInteger並檢查它是否比Integer.MAX_VALUE大:

BigInteger maxIntBigInteger = BigInteger.valueOf(Integer.MAX_VALUE); 
String str = "214748364781"; 
BigInteger bi = new BigInteger(str); 
if (bi.compareTo(maxIntBigInteger) > 0) { 
    System.out.println("Number is too big"); 
} else { 
    int res = bi.intValue(); 
    System.out.println(res); 
} 
1

如果您使用Java 8時,可以將其解析爲Long,然後使用Math.toIntExact(long value)來獲取int值。如果發生溢出,則會引發未檢查的ArithmeticException

這裏是你的代碼的例子:

String str = "214748364781"; 
int res = Math.toIntExact(Long.parseLong(str)); 

或進一步簡化:

int res = Math.toIntExact(Long.parseLong("214748364781")); 

和預期的一樣,我們得到的整數溢出異常如下:

Exception in thread "main" java.lang.ArithmeticException: integer overflow 
    at java.lang.Math.toIntExact(Math.java:1011)