Java 项目里有个 String 类型的公式表达式需要计算,有加减乘除带次方。。大佬们有什么方案么

2020-02-26 12:14:45 +08:00
 WANGKuZan

或者市面上有没有开箱即用的 jar

例如计算

String str = “1+23-4+(4/2)^25+(4/2)^2*2.222E-6”;

如何计算呢。。。

4563 次点击
所在节点    Java
26 条回复
zydxn
2020-02-26 12:28:30 +08:00
ScriptEngineManager
Perci
2020-02-26 12:30:55 +08:00
用夹娃实现计算器
zydxn
2020-02-26 12:32:05 +08:00
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName ("JavaScript");
final Object eval = engine.eval("1 + 23 - 4 + (4/2)^25 + (4/2)^2*2.222E-6");
System.out.println(eval);
lqs
2020-02-26 12:33:55 +08:00
内嵌一个 JS 或 Python 解释器(记得先把 ^替换成**)
zjsxwc
2020-02-26 12:37:22 +08:00
这表达式是科学计算器的语法,js 也不支持幂运算,直接调用命令行获取运算结果呗

```
$octave --eval "1+23-4+(4/2)^25+(4/2)^2*2.222E-6"
ans = 3.3554e+07
```
zjsxwc
2020-02-26 12:45:20 +08:00
no1xsyzy
2020-02-26 12:50:02 +08:00
@zjsxwc js 支持幂运算,只不过符号是 ** 而不是 ^
kerie
2020-02-26 12:51:51 +08:00
ScriptEngineManager 太重了,可以用 exp4j。
https://www.objecthunter.net/exp4j/
xwbz2018
2020-02-26 12:54:05 +08:00
<groupId>org.scijava</groupId>
<artifactId>jep</artifactId>

我用的这个,可以自定义函数
zjsxwc
2020-02-26 13:04:02 +08:00
@no1xsyzy 原来 js 可以啊
liujan
2020-02-26 13:09:13 +08:00
qlexpress 试试
leishi1313
2020-02-26 13:13:22 +08:00
老有人说做算法题没用,你把这俩题结合起来不就是你的需求了:
https://leetcode.com/problems/valid-number/
https://leetcode.com/problems/basic-calculator-ii/
qyvlik
2020-02-26 13:37:46 +08:00
可以参考这个项目 https://github.com/qyvlik/formula,支持变量替换计算。
具体是使用 JVM 自带的 ScriptEngine,移除 ScriptEngine 内的 `quit` 等有全局影响的函数,
创建可以参考如下:
https://github.com/qyvlik/formula/blob/master/src/main/java/io/github/qyvlik/formula/modules/formula/service/impl/FormulaCalculatorImpl.java#L65
创建指定 "-strict", "--no-java", "--no-syntax-extensions" 参数,创建完毕后,移除不必要的有全局副作用的 js 函数。

此外可以考虑自己练手,使用 一些编译原理、逆波兰表达式等知识,自己实现四则计算器,还可以顺手防止恶意代码注入呢。
blackFool
2020-02-26 13:53:36 +08:00
com.googlecode.aviator
chocotan
2020-02-26 13:55:12 +08:00
lqw3030
2020-02-26 14:04:03 +08:00
中序表达式转前序表达式
jorneyr
2020-02-26 14:04:06 +08:00
也可以调用 Groovy 脚本
hhhsuan
2020-02-26 14:26:17 +08:00
轮子太多了,一搜一大把,比如这个: https://mathparser.org/
xupefei
2020-02-26 14:38:51 +08:00
@leishi1313 带括号的应该是 基本计算器 3 那道题,相比 2 多了一个递归。

题刷多了,lz 这道题我用 10 分钟+记事本都能写出来…
mineqiqi
2020-02-26 15:03:23 +08:00
好像轮子挺多的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX