如何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/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; }