当我尝试计算像“7 + 3”之类的字符串然后将结果存储在BigInteger变量中时,我面临BigInteger的问题,它会抛出一个NumberFormat异常。有关这如何工作的任何指示? 例如:
String ist="7+2";
java.math.BigInteger a = new java.math.BigInteger(ist);
答案 0 :(得分:9)
BigInteger sum =(new BigInteger(7))。add(new BigInteger(3))
答案 1 :(得分:6)
BigInteger无法计算表达式。 事实上,我不知道Java中的任何解决方案来评估任意算术表达式 - 您可以尝试使用Groovy或者自己解析表达式。
如果您正在考虑解析,最简单的方法可能是从中缀符号转换为波兰符号,然后一次评估一个操作符的波兰形式。查看调车场算法。
答案 2 :(得分:2)
BigInteger
只会在您传递new java.math.BigInteger("9")
之类的数值时理解这一点。它无法解析您提供的内容。
答案 3 :(得分:2)
正如diciu和Peter Lang所说,BigInteger无法评估表达式。如果需要数字,在评估时会溢出某些原语(如Integer),您可以创建两个BigIntegers,然后计算结果。例如:
java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));
答案 4 :(得分: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=>