如何parsing以stringforms给出的mathexpression式并返回一个数字?

在Java中有一种方法可以从这个mathexpression式中得到结果:

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

另一方面,parsing算术expression式的最好方法是什么?

你可以将它传递给一个BeanShell bsh.Interpreter ,如下所示:

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

您需要确保您评估的string来自可靠的来源和通常的预防措施,否则会直接工作。

如果你想要更复杂(但更安全)的方法,你可以使用ANTLR (我怀疑有一个math语法作为出发点),并实际上自己编译/解释陈述。

我最近开发了一个expression式parsing器,并在Apache许可证下发布它。 你可以在http://projects.congrace.de/exp4j/index.html获取它;

希望有所帮助

您可以使用ScriptEngine类并将其评估为一个JavaScriptstring

 ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Object result = engine.eval("5+4*(7-15)"); 

的确,yu应该知道在javascript中下面的指令的结果:

  eval('var aa=5+4*(7-15)') aa // -27 

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

大概不会像你所希望的那样直截了当!

但也许你可以使用一个javax.script.ScriptEngine并将该string视为一个ECMAScriptexpression式,例如?

看看: Java平台的脚本 。

没有内在的做法。 但是,您可以使用许多可用的开源计算器之一。

Java SDK没有直接的支持。

您将不得不自己实现它(可能使用诸如JavaCC之类的parsing器生成器),或者使用现有的库。

一个select是JEP (商业),另一个JEval (自由软件)。

最近我使用了非常成熟的mathexpression式parsing器库,开放源码,为JAVA和.NET提供了相同的API。 库的名称是mXparser。 mXparser提供了基本的function(简单的公式parsing和计算)和更高级的(即用户定义的参数,函数)。 此外,值得注意的是,mXparser具有丰富的内置math集合(意味着运算符,一元/二元/可变参数函数,迭代运算符(如summation和product))。

http://mathparser.org/

http://mathparser.org/mxparser-tutorial/

请在下面的几个例子中find更清晰的语法视图。

例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

 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 – 用户定义的recursion

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

最好的祝福,

LK

有一个叫做formula4j的商业工具可以完成这个工作。

以您的示例expression式来看,将使用formula4j像这样评估:

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

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

你可以使用这个项目

如何使用:

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