Java 项目里有个 String 类型的公式表达式需要计算,有加减乘除带次方。。大佬们有什么方案么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WANGKuZan
V2EX    Java

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

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

    或者市面上有没有开箱即用的 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
    xyooyx
        16
    xyooyx  
       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     Solana     830 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 21:22 PVG 05:22 LAX 14:22 JFK 17:22
    Do have faith in what youre doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86