Java中有没有办法从这个数学表达式中得到结果:
String code = "5+4*(7-15)";
另一方面,解析算术表达式的最佳方法是什么?
答案 0 :(得分:34)
您可以将其传递给BeanShell bsh.Interpreter
,如下所示:
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));
您需要确保您评估的字符串来自可信来源和通常的预防措施,否则它将直接起作用。
如果你想采用一种更复杂(但更安全)的方法,你可以使用ANTLR(我怀疑有一个数学语法作为起点)并且实际上自己编译/解释该语句。
答案 1 :(得分:29)
我最近开发了一个表达式解析器,并在apache许可下发布了它。你可以在http://projects.congrace.de/exp4j/index.html
抓住它希望有所帮助
答案 2 :(得分:7)
您可以使用ScriptEngine类并将其评估为javascript字符串
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("5+4*(7-15)");
确实,你应该知道javascript中以下指令的结果:
eval('var aa=5+4*(7-15)')
aa // -27
可能有更好的方法,但这个方法有效。
答案 3 :(得分:5)
可能不像你希望的那样直截了当!
但也许您可以使用javax.script.ScriptEngine并将字符串视为ECMAScript表达式,例如?
答案 4 :(得分:4)
没有内置的方法可以做到这一点。但是你可以使用许多open source calculators中的一个。
答案 5 :(得分:3)
最近我使用非常成熟的数学表达式解析器库,开源,为JAVA和.NET提供相同的API。库名是mXparser。 mXparser提供基本功能(简单公式解析和计算)和更高级的功能(即用户定义的参数,函数)。另外值得注意的是,mXparser具有丰富的内置数学集合(意味着运算符,一元/二元/可变函数,迭代运算符,如求和和乘积)。
http://mathparser.org/mxparser-tutorial/
请在下面的几个示例中找到更清晰的语法视图。
示例1 - 简单公式
Expression e = new Expression("2+3");
double v = e.calculate();
示例2 - 内置函数
Expression e = new Expression("2+sin(3)");
double v = e.calculate();
示例3 - 内置常量
Expression e = new Expression("2+sin(pi)");
double v = e.calculate();
示例4 - 用户定义的参数和常量
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();
示例5 - 用户定义的函数
Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();
示例6 - 用户定义的递归
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();
经常发现 - 如果您想尝试语法(并查看高级用例),您可以下载由mXparser提供支持的Scalar Calculator应用程序。
祝你好运
LK
答案 6 :(得分:2)
答案 7 :(得分:0)
有一个名为formula4j的商业工具可以完成这项工作。
要获取示例表达式,将使用formula4j进行评估:
Formula formula = new Formula("5+4*(7-15)");
Decimal answer = formula.getAnswer(); //-27
答案 8 :(得分:0)
您可以使用project
使用方法:
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));
答案 9 :(得分:-2)
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;
}