Come analizzare un'espressione matematica fornita come stringa e restituire un numero? [duplicare]
-
07-07-2019 - |
Domanda
Questa domanda ha già una risposta qui:
Esiste un modo in Java per ottenere il risultato da questa espressione matematica:
String code = "5+4*(7-15)";
D'altra parte qual è il modo migliore per analizzare un'espressione aritmetica?
Soluzione
Puoi passarlo a un BeanShell bsh.Interpreter
, qualcosa del genere :
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));
Dovrai assicurarti che la stringa che valuti provenga da una fonte attendibile e le consuete precauzioni, ma per il resto funzionerà immediatamente.
Se vuoi seguire un approccio più complicato (ma più sicuro) puoi usare ANTLR (che sospetto ha una grammatica matematica come punto di partenza) e in realtà compila / interpreta la frase tu stesso.
Altri suggerimenti
Di recente ho sviluppato un parser di espressioni e l'ho rilasciato con la licenza apache. puoi prenderlo su http://projects.congrace.de/exp4j/index.html
spero che abbia aiutato
Puoi usare la classe ScriptEngine e valutarla come una stringa javascript
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("5+4*(7-15)");
In effetti, dovresti sapere che il risultato delle seguenti istruzioni in javascript:
eval('var aa=5+4*(7-15)')
aa // -27
Potrebbe esserci un modo migliore, ma questo funziona.
Probabilmente non nella maniera così semplice come speri!
Ma forse potresti usare un javax.script.ScriptEngine e trattare la stringa come un'espressione ECMAScript, per esempio?
Dai un'occhiata a: Scripting per la piattaforma Java .
Non esiste un modo integrato per farlo. Ma puoi utilizzare uno dei tanti calcolatori open source disponibili.
Recentemente stavo usando una libreria di parser di espressioni matematiche molto mature, open source, che forniva la stessa API per JAVA e .NET. Il nome della libreria è mXparser. mXparser fornisce funzionalità di base (analisi e calcolo di formule semplici) e funzionalità più avanzate (ad es. argomenti definiti dall'utente, funzioni). Inoltre, vale la pena notare che mXparser ha una ricca raccolta matematica integrata (ovvero operatori, funzioni unarie / binarie / variadiche, operatori iterati come somma e prodotto).
http://mathparser.org/mxparser-tutorial/
Di seguito alcuni esempi per avere una visione più chiara della sintassi.
Esempio 1 - formula semplice
Expression e = new Expression("2+3");
double v = e.calculate();
Esempio 2 - funzione integrata
Expression e = new Expression("2+sin(3)");
double v = e.calculate();
Esempio 3 - costanti integrate
Expression e = new Expression("2+sin(pi)");
double v = e.calculate();
Esempio 4: argomenti e costanti definiti dall'utente
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();
Esempio 5 - funzioni definite dall'utente
Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();
Esempio 6 - ricorsione definita dall'utente
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();
Trovato di recente: nel caso in cui si desideri provare la sintassi (e vedere il caso d'uso avanzato) è possibile scaricare calcolatrice scalare che è alimentata da mXparser.
Cordiali saluti
LK
Esiste uno strumento commerciale chiamato formula4j che svolge tale compito.
Per prendere la tua espressione di esempio, sarebbe valutata in questo modo usando formula4j:
Formula formula = nuova formula (" 5 + 4 * (7-15) ");
Risposta decimale = formula.getAnswer (); // - 27
Puoi usare quel progetto
Come usare:
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;
}