Come analizzare un'espressione matematica fornita come stringa e restituire un numero? [duplicare]

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

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?

È stato utile?

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/

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

Non esiste alcun supporto diretto nell'SDK Java per farlo.

Dovrai implementarlo tu stesso (possibilmente usando un generatore di parser come JavaCC) o usare una libreria esistente.

Un'opzione sarebbe JEP (commerciale), un'altra JEval (software gratuito).

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top