you the parser number must mathparser mathematical given framework evaluator java string parsing math expression

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



mathparser c# (10)

Esta pregunta ya tiene una respuesta aquí:

¿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?


¡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 .


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


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).



Podrías usar ese project

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


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 compilar / interpretar la afirmación por ti mismo.


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.



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 suma 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 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 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


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; }