2009-12-24 7 views
0

Le problème im face à BigInteger lorsque j'essaie de calculer une chaîne comme "7 + 3", puis en stockant le résultat dans une variable BigInteger, il lève une exception NumberFormat. Des indications sur comment cela peut-il fonctionner? Par exemple:En ce qui concerne java.math.BigInteger

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

S'il vous plaît préciser si vous avez besoin d'un BigInteger en effet de stocker un nombre trop grand pour un long, ou si vous juste besoin d'un analyseur d'expression et confondu le constructeur BigInteger (String). – MAK

+0

@MAK - J'ai besoin d'un analyseur d'expression et je suis également convaincu qu'une fois l'expression analysée et analysée, elle serait suffisamment longue pour être stockée dans un BigInteger. – ping

Répondre

6

BigInteger ne peut pas évaluer les expressions. En fait, je ne connais pas de solution en Java pour faire l'évaluation d'expressions arithmétiques arbitraires - vous pouvez essayer Groovy à la place ou analyser l'expression vous-même. Si vous envisagez l'analyse syntaxique, le plus simple est probablement de passer de la notation infixée à la notation polonaise, puis d'évaluer la forme polonaise d'un opérateur à la fois. Recherchez l'algorithme de triage de triage.

2

BigInteger ne le comprendra que si vous transmettez une valeur numérique comme new java.math.BigInteger("9"). Il ne peut pas analyser ce que vous fournissez.

2

Comme l'ont dit diciu et Peter Lang, BigInteger ne peut pas évaluer les expressions. Si vous avez besoin de nombres qui, une fois évalués, déborderaient d'une primitive comme un entier, vous pouvez créer deux BigIntegers et ensuite évaluer le résultat. Par exemple:.

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

BigInteger somme = (nouveaux BigInteger (7)) Ajouter (nouveaux BigInteger (3))

JepLite, Jeks, JbcParser, MESP et JEP sont toutes les bibliothèques peuvent analyser des expressions telles que "7 + 3"

+0

Avertissement - JEP n'est pas un logiciel libre. Vous devrez payer pour une licence. –

+0

v2.4.1 est gratuit. et la version commerciale a beaucoup d'excellentes améliorations et de nouvelles fonctionnalités. – jspcal

1

Si vous voulez vraiment évaluer les chaînes et ne vous dérange pas en utilisant s-expressions que vous pouvez ensuite utiliser Clojure:

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

Si vous prenez cette route, veillez à désinfecter les cordes avant de les évaluer ou vous pourriez vous exposer à des attaques par injection.

BTW quand Clojure évalue l'expression, il utilisera un BigInteger si nécessaire, par exemple:

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

Cela ne peut-il pas conduire à un type d'attaque par injection? La chaîne peut provenir d'un client aléatoire qui remplace le (+ 7 3) par une sorte d'appel système –