WANGKuZan
V2EX  ›  Java

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

  •  
  •   WANGKuZan · Feb 26, 2020 · 6069 views
    This topic created in 2442 days ago, the information mentioned may be changed or developed.

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

    例如计算

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

    如何计算呢。。。

    26 replies  •  2020-02-27 05:53:57 +08:00
    Tsukihime
    Tsukihime
    Feb 26, 2020❤️1
    1
    ScriptEngineManager
    Perci
    Perci
    Feb 26, 2020 via Android
    2
    用夹娃实现计算器
    Tsukihime
    Tsukihime
    Feb 26, 2020
    3
    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
    lqs
    Feb 26, 2020
    4
    内嵌一个 JS 或 Python 解释器(记得先把 ^替换成**)
    zjsxwc
    zjsxwc
    Feb 26, 2020
    5
    这表达式是科学计算器的语法,js 也不支持幂运算,直接调用命令行获取运算结果呗

    ```
    $octave --eval "1+23-4+(4/2)^25+(4/2)^2*2.222E-6"
    ans = 3.3554e+07
    ```
    no1xsyzy
    no1xsyzy
    Feb 26, 2020
    7
    @zjsxwc js 支持幂运算,只不过符号是 ** 而不是 ^
    kerie
    kerie
    Feb 26, 2020❤️1
    8
    ScriptEngineManager 太重了,可以用 exp4j。
    https://www.objecthunter.net/exp4j/
    xwbz2018
    xwbz2018
    Feb 26, 2020 via Android❤️1
    9
    <groupId>org.scijava</groupId>
    <artifactId>jep</artifactId>

    我用的这个,可以自定义函数
    zjsxwc
    zjsxwc
    Feb 26, 2020
    10
    @no1xsyzy 原来 js 可以啊
    liujan
    liujan
    Feb 26, 2020 via iPhone
    11
    qlexpress 试试
    leishi1313
    leishi1313
    Feb 26, 2020 via Android❤️1
    12
    老有人说做算法题没用,你把这俩题结合起来不就是你的需求了:
    https://leetcode.com/problems/valid-number/
    https://leetcode.com/problems/basic-calculator-ii/
    qyvlik
    qyvlik
    Feb 26, 2020
    13
    可以参考这个项目 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
    blackFool
    Feb 26, 2020
    14
    com.googlecode.aviator
    xyooyx
    xyooyx
    Feb 26, 2020
    16
    中序表达式转前序表达式
    jorneyr
    jorneyr
    Feb 26, 2020
    17
    也可以调用 Groovy 脚本
    hhhsuan
    hhhsuan
    Feb 26, 2020
    18
    轮子太多了,一搜一大把,比如这个: https://mathparser.org/
    xupefei
    xupefei
    Feb 26, 2020 via iPhone
    19
    @leishi1313 带括号的应该是 基本计算器 3 那道题,相比 2 多了一个递归。

    题刷多了,lz 这道题我用 10 分钟+记事本都能写出来…
    mineqiqi
    mineqiqi
    Feb 26, 2020
    20
    好像轮子挺多的
    hantsy
    hantsy
    Feb 26, 2020
    21
    @leishi1313 按照以前大学的数据结构课程,字符是不是应该用什么 FIFO 容器存放,一个个字符分析,加减乘除()有优先级不同。
    HuHui
    HuHui
    Feb 26, 2020
    22
    Apache Commons JEXL
    Comdex
    Comdex
    Feb 26, 2020 via iPhone
    24
    中缀表达式
    bjrjk
    bjrjk
    Feb 27, 2020 via Android
    25
    中缀表达式转后缀表达式再计算结果输出
    leishi1313
    leishi1313
    Feb 27, 2020 via Android
    26
    @xupefei 3 要会员😂
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1383 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 22:48 · PVG 06:48 · LAX 14:48 · JFK 17:48
    ♥ Do have faith in what you're doing.