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

¿Hay alguna forma en Java para 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?

Puede pasarlo a 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 las precauciones habituales, pero de lo contrario funcionará inmediatamente.

Si quieres ir a un enfoque más complicado (pero más seguro) podrías utilizar ANTLR (que sospecho que tiene una gramática matemática como punto de partida) y comstackr / interpretar la afirmación por ti mismo.

Recientemente desarrollé un analizador de expresiones y lo liberé bajo la licencia de 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 javascript

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

De hecho, deberías 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 esperas!

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: Creación de scripts para la plataforma Java .

No hay una forma integrada de hacerlo. Pero puede usar una de las muchas calculadoras de código abierto disponibles.

Recientemente estaba usando una biblioteca de analizador de expresiones matemáticas muy madura, de código abierto, que proporciona 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 observar que mXparser tiene una rica colección matemática incorporada (es decir, operadores, funciones unarias / binarias / variadas, operadores iterados, como sum y producto).

http://mathparser.org/

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

A continuación, encontrará algunos ejemplos para tener una vista más clara de la syntax.

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 incorporadas

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

Atentamente,

LK

No hay soporte directo en Java SDK para hacer esto.

Deberá implementarlo usted mismo (posiblemente utilizando un generador de analizador sintáctico como JavaCC) o utilizar una biblioteca existente.

Una opción sería JEP (comercial), otro 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 form4j:

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

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

Podrías usar ese proyecto

Cómo utilizar:

 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