質問

    

この質問にはすでに回答があります:

         

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/

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

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

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

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

その仕事をする 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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top