0

「7 + 3」のような文字列を計算し、その結果を BigInteger 変数に格納しようとすると、BigInteger で直面する問題は、NumberFormat 例外をスローします。これがどのように機能するかについての指針はありますか? 例えば:

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

5 に答える 5

9

BigInteger 合計 = (新しい BigInteger(7)).add(新しい BigInteger(3))

JepLiteJeksJbcParserMESP、およびJEPはすべて、「7+3」のような式を解析できるライブラリです。

于 2009-12-24T20:58:04.380 に答える
6

BigInteger は式を評価できません。実際、Java で任意の算術式の評価を行うための解決策を私は知りません。代わりに Groovy を試すか、式を自分で解析することができます。

構文解析を検討している場合、おそらく最も簡単な方法は、中置表記法から洗練された表記法に変換し、一度に 1 つの演算子で洗練された形式を評価することです。操車場のアルゴリズムを調べてください。

于 2009-12-24T20:54:21.873 に答える
2

BigIntegerのような数値を渡した場合にのみ、それを理解しますnew java.math.BigInteger("9")。あなたが提供したものを解析できません。

于 2009-12-24T20:57:04.083 に答える
2

diciu と Peter Lang が述べているように、BigInteger は式を評価できません。評価時に整数などのプリミティブをオーバーフローする数値が必要な場合は、2 つの 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 に答える