¿Cómo analizar una expresión matemática dada como una cadena y devolver un número? [duplicar]
-
07-07-2019 - |
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?
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/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
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;
}