Javaでこの数式から結果を取得する方法はありますか:
String code = "5+4*(7-15)";
一方、算術式を解析する最良の方法は何ですか?
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(出発点として数学の文法があると思われる)を使用して、実際に自分でステートメントをコンパイル/解釈することができます。
私は最近、式パーサーを開発し、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 式として扱うことはできますか?
以下をご覧ください: Scripting for the Java Platform。
それを行う組み込みの方法はありません。ただし、利用可能な多くのオープン ソースの電卓のいずれかを使用できます。
その仕事をするフォーミュラ4jと呼ばれるオープンソースのツールがあります。
式の例を取り上げると、式4jを使用して次のように評価されます。
Formula formula = new Formula("5+4*(7-15)");
Decimal answer = 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;
}