文字列として指定された数式を解析し、数値を返す方法は? [複製]
-
07-07-2019 - |
質問
この質問にはすでに回答があります:
Javaでこの数式から結果を取得する方法はありますか
String code = "5+4*(7-15)";
他方、算術式を解析する最良の方法は何ですか?
解決
BeanShell bsh.Interpreter
に渡すことができます。 :
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));
評価する文字列は、信頼できるソースからのものであり、通常の予防策である必要がありますが、それ以外の場合はすぐに機能します。
より複雑な(しかしより安全な)アプローチを行いたい場合は、 ANTLR を使用できます(疑わしい)数学の文法を出発点として)、実際に自分でステートメントをコンパイル/解釈します。
他のヒント
iは最近式パーサーを開発し、Apacheライセンスの下でリリースしました。 http://projects.congrace.de/exp4j/index.html
で入手できます。助けた希望
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
より良い方法があるかもしれませんが、これは機能します。
おそらくあなたが期待しているほど単純な方法ではありません!
しかし、おそらくjavax.script.ScriptEngineを使用して、文字列をECMAScript式として扱うことができますか?
をご覧ください: Javaプラットフォームのスクリプト。
これを行う組み込みの方法はありません。ただし、多くのオープンソース計算機のいずれかを使用できます。利用可能。
最近、非常に成熟した数学式パーサーライブラリであるオープンソースを使用して、JAVAと.NETに同じAPIを提供していました。ライブラリー名はmXparserです。 mXparserは、基本的な機能(単純な数式の解析と計算)とより高度な機能(つまり、ユーザー定義の引数、関数)を提供します。さらに、mXparserには豊富な組み込み数学コレクション(演算子、単項/バイナリ/可変引数関数、加算や積などの反復演算子を意味する)が組み込まれていることに注意してください。
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を搭載したスカラー計算機アプリ。
よろしく
LK
その仕事をする formula4j という商用ツールがあります。
サンプルの式を取得するには、formula4jを使用して次のように評価します。
Formula formula = new Formula(" 5 + 4 *(7-15)");
10進数の答え= formula.getAnswer(); //-27
使用方法:
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));
public static int calc(String string){
int result=0;
String numbers="0123456789";
String operations="+-/*";
for (int i=0;i<string.length();i++){
if (numbers.contains(string.charAt(i)+"")){
result=result*10+(Integer.parseInt(string.charAt(i)+""));
}
else {
if (string.charAt(i)=='+'){ result+=calc(string.substring(i+1));}
if (string.charAt(i)=='-'){ result-=calc(string.substring(i+1));}
if (string.charAt(i)=='*'){ result*=calc(string.substring(i+1));}
if (string.charAt(i)=='/'){ try{result/=calc(string.substring(i+1));}
catch (ArithmeticException e){
System.err.println("You cannot devide by Zero!");}
}
break;
}
}
return result;
}