Wie man einen mathematischen Ausdruck als String und zurück eine Nummer analysieren? [Duplikat]

StackOverflow https://stackoverflow.com/questions/1432245

Frage

    

Diese Frage bereits eine Antwort hier:

         

Gibt es eine Möglichkeit in Java das Ergebnis von diesem mathematischen Ausdruck zu erhalten:

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

In anderer Seite, was ist der beste Weg, einen arithmetischen Ausdruck zu analysieren?

War es hilfreich?

Lösung

Sie können es passieren ein bsh.Interpreter Beanshell, so etwas wie folgt aus:

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

Sie werden die Zeichenfolge Sie sicherstellen möchten, bewerten von einer vertrauenswürdigen Quelle ist und die üblichen Vorsichtsmaßnahmen, aber ansonsten wird es auf Anhieb funktionieren.

Wenn Sie eine kompliziertere (aber sicherer) Ansatz gehen wollen könnten Sie ANTLR (dass ich vermute, eine mathematische Grammatik als Ausgangspunkt hat) und tatsächlich kompiliert / interpretieren die Aussage selbst.

Andere Tipps

i entwickelte kürzlich einen Ausdruck Parser und veröffentlichte sie unter der Apache-Lizenz. Sie können es unter http://projects.congrace.de/exp4j/index.html greifen

Hoffnung, die dazu beigetragen

Sie können die Script Klasse verwenden und sie als JavaScript-String auswerten

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

Tatsächlich soll yu wissen, dass das Ergebnis der folgenden Anweisung in javascript:

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

Es kann eine bessere Art und Weise sein, aber diese funktioniert.

Wahrscheinlich nicht so geradlinig in einer Art und Weise, wie Sie hoffen!

Aber vielleicht könnten Sie einen javax.script.ScriptEngine verwenden und die Zeichenfolge als ECMAScript Ausdruck, zum Beispiel zu behandeln?

Werfen Sie einen Blick auf: Scripting für die Java-Plattform .

Es gibt keine eingebaute Möglichkeit, dies zu tun. Aber Sie können Sie eine der vielen, vielen Open-Source-Rechner zur Verfügung.

Vor kurzem war ich mit sehr reifen mathematischen Ausdruck Parser Bibliothek, Open Source, die gleiche API für JAVA und .NET geben. Der Bibliotheksname ist mXparser. mXparser bietet grundlegende Funktionalitäten (einfache Formeln Parsen und Berechnung) und fortgeschritteneren (d.h. Benutzer definierten Argumente, Funktionen). Außerdem lohnt es sich, zu bemerken, dass mXparser hat reiche integrierten mathematischen Sammlung (dh Betreiber, einstellige / Binär / variadische Funktionen, iteriert Operatoren wie Addition und Produkt).

http://mathparser.org/

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

Bitte unten einige Beispiele finden mehr klare Sicht auf die Syntax.

Beispiel 1 - einfache Formel

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

Beispiel 2 - integrierte Funktion

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

Beispiel 3 - integrierte Konstanten

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

Beispiel 4 - Benutzerdefinierte Argumente und Konstanten

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();

Beispiel 5 - benutzerdefinierte Funktionen

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

Beispiel 6 - Benutzer definiert Rekursion

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();

Gefunden recntly - falls Sie die Syntax versuchen möchten (und sehen Sie die erweiterte Anwendungsfall) können Sie die Scalar Calculator App, die von mXparser angetrieben wird.

Mit freundlichen Grüßen

LK

Es gibt keine direkte Unterstützung im Java-SDK für dies zu tun.

Sie werden entweder es selbst zu implementieren (möglicherweise einen Parser-Generator wie JavaCC verwenden) oder eine vorhandene Bibliothek verwenden.

Eine Möglichkeit wäre, JEP (kommerziell), ein anderer JEval (freie Software).

Es gibt ein kommerzielles Tool namens formula4j das tut diesen Job.

Ihr Beispiel Ausdruck zu nehmen, würde es so mit formula4j bewertet werden:

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

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

Sie coul, dass Projekt verwenden

Wie verwenden:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top