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 una forma integrada de hacerlo. Pero puede usar una de las muchas calculadoras de código abierto disponibles.
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 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
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/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;
}