43

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

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

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

4

10 に答える 10

36

次のようにBeanShell に渡すことができます。bsh.Interpreter

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

評価する文字列が信頼できるソースからのものであり、通常の予防措置を講じていることを確認する必要がありますが、それ以外の場合はすぐに機能します。

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

于 2009-09-16T11:00:17.973 に答える
31

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

役に立ったことを願っています

于 2011-03-09T16:03:34.493 に答える
9

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

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

于 2014-04-21T04:11:31.997 に答える
5

おそらく、あなたが望んでいるほど単純な方法ではありません!

しかし、たとえば、javax.script.ScriptEngine を使用して文字列を ECMAScript 式として扱うことはできますか?

以下をご覧ください: Scripting for the Java Platform

于 2009-09-16T10:57:31.587 に答える
4

それを行う組み込みの方法はありません。ただし、利用可能な多くのオープン ソースの電卓のいずれかを使用できます。

于 2009-09-16T10:55:52.397 に答える
1

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

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

1 つのオプションはJEP (商用) で、もう1 つのオプションはJEval (フリーソフトウェア) です。

于 2009-09-16T10:58:51.897 に答える
0

その仕事をするフォーミュラ4jと呼ばれるオープンソースのツールがあります。

式の例を取り上げると、式4jを使用して次のように評価されます。

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

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

于 2013-02-15T00:43:15.327 に答える
0

そのプロジェクトを使用できます

使い方:

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));
于 2014-01-21T20:31:20.110 に答える
-2
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;
}
于 2014-12-19T10:51:25.653 に答える