2016-10-29 1 views
2

String 표현이 int 인 경우 오버플로를 확인하고 싶습니다.int의 문자열 표현이 주어진 경우 오버플로를 확인하십시오

parseInt과 같은 Java의 내장 함수를 사용하여 Stringint으로 변환하는 방법을 알고 있습니다. 그러나 String 크기가 커서 int에 맞지 않는 경우 어떻게해야합니까?

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

가 나는 String 표현의 기호를 확인 parseInt을하려고 노력하고 징후는 다음과 일치하지 않는 경우 내가 실제로 그것을 실행했을 때 int 랩은 약하지만이 NumberFormat을 던진 이후는 오버 플로우가하는 것을 말할 수있다 예외.

NumberFormat은 잘못된 형식의 문자열에 대해 throw되므로 오버플로가 보장되지 않습니다.

그래서 입력 문자열의 형식이 올바른지 (모든 숫자) 확인한 다음 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으로 구문 분석하면 throw하고 Exception을 입력하면 오버플로됩니다.

또는

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)