0

当我尝试计算像“7 + 3”这样的字符串然后将结果存储在 BigInteger 变量中时,我面临的 BigInteger 问题会引发 NumberFormat 异常。关于如何工作的任何指示?例如:

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

5 回答 5

9

BigInteger sum = (new BigInteger(7)).add(new BigInteger(3))

JepLiteJeksJbcParserMESPJEP都是可以解析“7+3”等表达式的库

于 2009-12-24T20:58:04.380 回答
6

BigInteger 无法计算表达式。事实上,我不知道 Java 中有任何解决方案可以对任意算术表达式进行求值 - 您可以尝试使用 Groovy 或自己解析表达式。

如果您正在考虑解析,最简单的方法可能是将中缀表示法转换为波兰表示法,然后一次从一个运算符评估波兰语。查找调车场算法。

于 2009-12-24T20:54:21.873 回答
2

BigInteger只会明白,当你传递一个像new java.math.BigInteger("9"). 它无法解析您提供的内容。

于 2009-12-24T20:57:04.083 回答
2

正如 diciu 和 Peter Lang 所说,BigInteger 不能计算表达式。如果您需要在求值时会溢出某些原语(如 Integer)的数字,您可以创建两个 BigInteger,然后对结果求值。例如:

java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));
于 2009-12-24T20:57:51.617 回答
1

如果您真的想评估字符串并且不介意使用 s 表达式,那么您可以使用 Clojure:

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

以下是从 Java 调用 Clojure 的说明

如果您采用这种方法,请在评估字符串之前小心清理字符串,否则您可能会受到注入攻击。

顺便说一句,当 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=>
于 2009-12-24T20:59:19.163 回答