2009-12-24 5 views
0

"7 + 3"과 같은 문자열을 계산하고 그 결과를 BigInteger 변수에 저장하려고하면 BigInteger와 마주 보는 문제가 발생하여 NumberFormat 예외가 발생합니다. 이것이 어떻게 작동 할 수 있는지에 대한 조언이 있습니까? 예 :For java.math.BigInteger

String ist="7+2"; 
    java.math.BigInteger a = new java.math.BigInteger(ist); 
+3

분명히 당신이 경우 실제로 오랫동안 숫자 너무 큰 저장하는 BigInteger의 필요 여부를 확인하시기 바랍니다 그냥 표현 파서가 필요하고 BigInteger (String) 생성자를 착각했습니다. – MAK

+0

@MAK - 표현 파서가 필요하며 일단 표현식이 파싱되고 평가되면 BigInteger에 저장하기에 충분히 길다는 것을 확신합니다. – ping

답변

6

BigInteger는 표현식을 평가할 수 없습니다. 사실 임의의 산술 표현식에 대한 평가를 수행하는 Java의 해결책에 대해서는 잘 모르겠다. Groovy를 대신 사용해 보거나 표현식을 직접 파싱 할 수있다.

구문 분석을 고려하는 경우 가장 간단한 방법은 중급 표기법을 폴란드어 표기법으로 변환 한 다음 한 번에 한 명의 연산자로 폴란드어 양식을 평가하는 것입니다. shunting 야드 알고리즘을보세요.

2

BigIntegernew java.math.BigInteger("9")과 같은 숫자 값을 전달할 때만 알 수 있습니다. 당신이 제공하는 것을 분석 할 수 없습니다.

2

diciu와 Peter Lang이 말한 것처럼 BigInteger는 표현식을 평가할 수 없습니다. 계산할 때 Integer와 같은 일부 프리미티브를 오버플로하는 숫자가 필요하면 두 개의 BigInteger를 만들고 결과를 평가할 수 있습니다. .

java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2")); 
9

BigInteger의 합 = (새 BigInteger를 (7))를 추가 (새 BigInteger의 (3))

JepLite, Jeks는, JbcParser는, MESP, 그리고 JEP 모든 라이브러리를 구문 분석 할 수있다 표현 같은 : 예를 들어 "7 + 3"

+0

경고 - JEP는 무료 소프트웨어가 아닙니다. 면허증을 지불해야합니다. –

+0

v2.4.1은 무료입니다. 상업용 버전에는 많은 우수한 기능 향상 및 새로운 기능이 있습니다. – jspcal

1

당신이 정말로 문자열을 평가하려는 당신은 당신이 사용할 수있는 S-표현식을 사용 괜찮다면 Clojure의 :

Clojure 1.0.0- 
user=> (def s "(+ 7 3)") 
#'user/s 
user=> (load-string s) 
10 
user=> 

여기에 instructions for invoking Clojure from Java

당신이 평가하기 전에이 경로를주의 깊게 살피면 주입 공격에 노출 될 수 있습니다.

BTW Clojure의는 예를 들어 필요한 경우는 인 BigInteger를 사용하는 표현식을 평가할 때 :

user=> (def s "(+ 1 2)") 
#'user/s 
user=> (def r (load-string s)) 
#'user/r 
user=> (. r getClass) 
java.lang.Integer 
user=> (def s "(+ 1000000000000000000000000 20000000000000000000000)") 
#'user/s 
user=> (def r (load-string s)) 
#'user/r 
user=> (. r getClass) 
java.math.BigInteger 
user=> 
+1

이것이 어떤 종류의 주사 공격으로 이어질 수 있습니까? 이 문자열은 (+ 7 3)을 시스템 호출의 일종으로 대체 한 임의의 임의의 클라이언트에서 유래 한 것일 수 있습니다 –