Wie man einen mathematischen Ausdruck als String und zurück eine Nummer analysieren? [Duplikat]
-
07-07-2019 - |
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?
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/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 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;
}