V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WANGKuZan
V2EX  ›  Java

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

  •  
  •   WANGKuZan · 2020-02-26 12:14:45 +08:00 · 4559 次点击
    这是一个创建于 1761 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    例如计算

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

    如何计算呢。。。

    26 条回复    2020-02-27 05:53:57 +08:00
    zydxn
        1
    zydxn  
       2020-02-26 12:28:30 +08:00   ❤️ 1
    ScriptEngineManager
    Perci
        2
    Perci  
       2020-02-26 12:30:55 +08:00 via Android
    用夹娃实现计算器
    zydxn
        3
    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
        4
    lqs  
       2020-02-26 12:33:55 +08:00
    内嵌一个 JS 或 Python 解释器(记得先把 ^替换成**)
    zjsxwc
        5
    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
        6
    zjsxwc  
       2020-02-26 12:45:20 +08:00
    no1xsyzy
        7
    no1xsyzy  
       2020-02-26 12:50:02 +08:00
    @zjsxwc js 支持幂运算,只不过符号是 ** 而不是 ^
    kerie
        8
    kerie  
       2020-02-26 12:51:51 +08:00   ❤️ 1
    ScriptEngineManager 太重了,可以用 exp4j。
    https://www.objecthunter.net/exp4j/
    xwbz2018
        9
    xwbz2018  
       2020-02-26 12:54:05 +08:00 via Android   ❤️ 1
    <groupId>org.scijava</groupId>
    <artifactId>jep</artifactId>

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

    题刷多了,lz 这道题我用 10 分钟+记事本都能写出来…
    mineqiqi
        20
    mineqiqi  
       2020-02-26 15:03:23 +08:00
    好像轮子挺多的
    hantsy
        21
    hantsy  
       2020-02-26 15:16:38 +08:00
    @leishi1313 按照以前大学的数据结构课程,字符是不是应该用什么 FIFO 容器存放,一个个字符分析,加减乘除()有优先级不同。
    HuHui
        22
    HuHui  
       2020-02-26 15:16:54 +08:00
    Apache Commons JEXL
    ic2y
        23
    ic2y  
       2020-02-26 22:26:07 +08:00
    Comdex
        24
    Comdex  
       2020-02-26 23:27:06 +08:00 via iPhone
    中缀表达式
    bjrjk
        25
    bjrjk  
       2020-02-27 00:09:22 +08:00 via Android
    中缀表达式转后缀表达式再计算结果输出
    leishi1313
        26
    leishi1313  
       2020-02-27 05:53:57 +08:00 via Android
    @xupefei 3 要会员😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1050 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:20 · PVG 07:20 · LAX 15:20 · JFK 18:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.