2016-10-29 20 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)