¿Cómo analizar una expresión matemática dada como una cadena y devolver un número? [duplicar]

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

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Hay alguna manera en Java de obtener el resultado de esta expresión matemática:

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

Por otro lado, ¿cuál es la mejor manera de analizar una expresión aritmética?

¿Fue útil?

Solución

Puede pasarlo a un BeanShell bsh.Interpreter , algo como esto :

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

Deberá asegurarse de que la cadena que evalúa proviene de una fuente confiable y de las precauciones habituales, pero de lo contrario funcionará directamente.

Si desea adoptar un enfoque más complicado (pero más seguro), puede usar ANTLR (que sospecho tiene una gramática matemática como punto de partida) y realmente compila / interpreta la declaración usted mismo.

Otros consejos

desarrollé recientemente un analizador de expresiones y lo lancé bajo la licencia apache. puede obtenerlo en http://projects.congrace.de/exp4j/index.html

espero que haya ayudado

Puede usar la clase ScriptEngine y evaluarla como una cadena de JavaScript

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

De hecho, debe saber que el resultado de las siguientes instrucciones en JavaScript:

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

Puede haber una mejor manera, pero esta funciona.

¡Probablemente no de una manera tan directa como esperabas!

¿Pero quizás podría usar un javax.script.ScriptEngine y tratar la cadena como una expresión ECMAScript, por ejemplo?

Eche un vistazo a: Scripting para la plataforma Java .

No hay forma integrada de hacerlo. Pero puede usar uno de los muchos calculadoras de código abierto disponible.

Recientemente estaba usando una biblioteca analizadora de expresiones matemáticas muy madura, de código abierto, que daba la misma API para JAVA y .NET. El nombre de la biblioteca es mXparser. mXparser proporciona funcionalidades básicas (análisis y cálculo de fórmulas simples) y funciones más avanzadas (es decir, argumentos definidos por el usuario, funciones). Además, vale la pena notar que mXparser tiene una rica colección matemática incorporada (es decir, operadores, funciones unarias / binarias / variables, operadores iterados como suma y producto).

http://mathparser.org/

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

Encuentre a continuación algunos ejemplos para tener una visión más clara de la sintaxis.

Ejemplo 1 - fórmula simple

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

Ejemplo 2 - función incorporada

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

Ejemplo 3 - constantes integradas

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

Ejemplo 4: argumentos y constantes definidos por el usuario

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

Ejemplo 5 - funciones definidas por el usuario

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

Ejemplo 6 - recursión definida por el usuario

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

Encontrado recientemente: en caso de que desee probar la sintaxis (y ver el caso de uso avanzado), puede descargar Calculadora escalar aplicación que funciona con mXparser.

Saludos

LK

No hay soporte directo en el SDK de Java para hacer esto.

Tendrá que implementarlo usted mismo (posiblemente usando un generador de analizador como JavaCC), o usar una biblioteca existente.

Una opción sería JEP (comercial), otra JEval (software libre).

Hay una herramienta comercial llamada formula4j que hace ese trabajo.

Para tomar su expresión de ejemplo, se evaluaría así usando la fórmula 4j:

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

Respuesta decimal = formula.getAnswer (); // - 27

Puede utilizar ese proyecto

Cómo usar:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top