web-dev-qa-db-ja.com

文字列として指定された数式を解析し、数値を返す方法は?

Javaにこの数式から結果を取得する方法はありますか?

String code = "5+4*(7-15)";

一方、算術式を解析する最良の方法は何ですか?

38

これを BeanShellbsh.Interpreterに渡すことができます。次のようなものです。

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

評価する文字列が信頼できるソースと通常の予防策からのものであることを確認する必要がありますが、そうでなければすぐに機能します。

より複雑な(しかしより安全な)アプローチをしたい場合は、 [〜#〜] antlr [〜#〜] (開始点として数学文法があると思われる)を使用し、実際にコンパイルできます。自分でステートメントを解釈します。

34
Nick Holt

私は最近、式パーサーを開発し、Apacheライセンスでリリースしました。 http://projects.congrace.de/exp4j/index.html で入手できます

助けたことを願っています

30
fasseg

ScriptEngineクラスを使用して、javascript文字列として評価できます

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");        
Object result = engine.eval("5+4*(7-15)");

確かに、あなたはjavascriptの次の命令の結果を知っている必要があります:

   eval('var aa=5+4*(7-15)')
   aa // -27

より良い方法があるかもしれませんが、これは機能します。

7
Abdennour TOUMI

おそらくあなたが期待しているほど簡単な方法ではありません!

しかし、おそらくjavax.script.ScriptEngineを使用して、文字列をECMAScript式として扱うことができますか?

Java Platform のスクリプティングをご覧ください。

5
Andy

それを行う組み込みの方法はありません。しかし、多くの オープンソース計算機 のいずれかを使用できます。

4
soulmerge

最近、非常に成熟した数学式パーサーライブラリ、オープンソースを使用して、Javaおよび.NETに同じAPIを提供しました。ライブラリ名はmXparserです。mXparserは基本的な機能を提供します。さらに高度なもの(つまり、ユーザー定義の引数、関数)。さらに、mXparserには豊富な組み込み数学コレクション(演算子、単項/バイナリ/可変関数、合計や積などの反復演算子)が含まれていることに注意してください。

http://mathparser.org/

http://mathparser.org/mxparser-tutorial/

構文をより明確に把握するには、以下の例をご覧ください。

例1-簡単な数式

Expression e = new Expression("2+3");
double v = e.calculate();

例2-組み込み関数

Expression e = new Expression("2+sin(3)");
double v = e.calculate();

例3-組み込み定数

Expression e = new Expression("2+sin(pi)");
double v = e.calculate();

例4-ユーザー定義の引数と定数

Argument x = new Argument("x = 5");
Constant a = new Constant("a = 2 + sin(3)");
Expression e = new Expression("a + x^2", x, a);
double v1 = e.calculate();
x.setArgumentValue(10);
double v2 = e.calculate();

例5-ユーザー定義関数

Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();

例6-ユーザー定義の再帰

Function factorial = new Function("fact(n) = if( n > 0; n*fact(n-1); 1)");
Expression e = new Expression("fact(10) - 10!", factorial);
double v = e.calculate();

最近見つかった-構文を試してみたい場合(および高度な使用例を参照したい場合)、mXparserを搭載した Scalar Calculator アプリをダウンロードできます。

宜しくお願いします

LK

3
Leroy Kegan

Java SDKでこれを行うための直接的なサポートはありません。

自分で実装する(JavaCCなどのパーサージェネレーターを使用する)か、既存のライブラリを使用する必要があります。

1つのオプションは [〜#〜] jep [〜#〜] (商用)、別のオプションは JEval (フリーソフトウェア)です。

1
sleske

formula4j という商用ツールがあり、それがその仕事をします。

例の式を取得するには、formula4jを使用して次のように評価します。

Formula formula = new Formula("5+4*(7-15)");

Decimal answer = formula.getAnswer(); //-27

0
John O

あなたはそれを使用することができます project

使い方:

double result = 0;
String code = "5+4*(7-15)";
try {
    Expr expr = Parser.parse(code);
    result = expr.value();
} catch (SyntaxException e) {
    e.printStackTrace();
}
System.out.println(String.format("Result: %.04f", result));
0
Jc Miñarro