「7 + 3」のような文字列を計算し、その結果を BigInteger 変数に格納しようとすると、BigInteger で直面する問題は、NumberFormat 例外をスローします。これがどのように機能するかについての指針はありますか? 例えば:
String ist="7+2";
java.math.BigInteger a = new java.math.BigInteger(ist);
「7 + 3」のような文字列を計算し、その結果を BigInteger 変数に格納しようとすると、BigInteger で直面する問題は、NumberFormat 例外をスローします。これがどのように機能するかについての指針はありますか? 例えば:
String ist="7+2";
java.math.BigInteger a = new java.math.BigInteger(ist);
BigInteger は式を評価できません。実際、Java で任意の算術式の評価を行うための解決策を私は知りません。代わりに Groovy を試すか、式を自分で解析することができます。
構文解析を検討している場合、おそらく最も簡単な方法は、中置表記法から洗練された表記法に変換し、一度に 1 つの演算子で洗練された形式を評価することです。操車場のアルゴリズムを調べてください。
BigInteger
のような数値を渡した場合にのみ、それを理解しますnew java.math.BigInteger("9")
。あなたが提供したものを解析できません。
diciu と Peter Lang が述べているように、BigInteger は式を評価できません。評価時に整数などのプリミティブをオーバーフローする数値が必要な場合は、2 つの BigInteger を作成してから結果を評価できます。例えば:
java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));
本当に文字列を評価したいが、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=>