43

Java中有没有办法从这个数学表达式中得到结果:

String code = "5+4*(7-15)";

另一方面,解析算术表达式的最佳方法是什么?

4

10 回答 10

36

您可以将其传递给BeanShell bsh.Interpreter,如下所示:

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

您需要确保您评估的字符串来自受信任的来源和通常的预防措施,否则它将直接工作。

如果您想采用更复杂(但更安全)的方法,您可以使用ANTLR(我怀疑它以数学语法为起点)并自己实际编译/解释语句。

于 2009-09-16T11:00:17.973 回答
31

我最近开发了一个表达式解析器,并在 apache 许可下发布了它。你可以在http://projects.congrace.de/exp4j/index.html

希望有帮助

于 2011-03-09T16:03:34.493 回答
9

您可以使用 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

可能有更好的方法,但这个方法有效。

于 2014-04-21T04:11:31.997 回答
5

可能不像您希望的那样直截了当!

但也许您可以使用 javax.script.ScriptEngine 并将字符串视为 ECMAScript 表达式,例如?

看看:Java 平台的脚本

于 2009-09-16T10:57:31.587 回答
4

没有内置的方法可以做到这一点。但是您可以使用众多可用的开源计算器之一。

于 2009-09-16T10:55:52.397 回答
4

最近我在使用非常成熟的数学表达式解析器库,开源,为 JAVA 和 .NET 提供相同的 API。库名称是 mXparser。mXparser 提供基本功能(简单的公式解析和计算)和更高级的功能(即用户定义的参数、函数)。另外值得注意的是,mXparser 具有丰富的内置数学集合(含义运算符、一元/二元/可变参数函数、迭代运算符,如求和和乘积)。

https://mathparser.org/

https://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 应用程序。

最好的祝福

力劲

于 2016-03-31T19:22:13.963 回答
1

Java SDK 中没有直接支持这样做。

您要么必须自己实现它(可能使用解析器生成器,如 JavaCC),要么使用现有的库。

一种选择是JEP(商业),另一种是 JEval(免费软件)。

于 2009-09-16T10:58:51.897 回答
0

有一个名为formula4j的开源工具可以完成这项工作。

以您的示例表达式为例,它将使用 formula4j 像这样进行评估:

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

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

于 2013-02-15T00:43:15.327 回答
0

你可以使用那个项目

如何使用:

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));
于 2014-01-21T20:31:20.110 回答
-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;
}
于 2014-12-19T10:51:25.653 回答