JAVA-程序动态执行字符串公式

JAVA-程序动态执行字符串公式

问题背景描述

在实际开发过程中,需要通过配置表动态配置计算公式以及动态传入值,当前java会自动将字符串公式转义无法直接计算其结果。
例如:有公式:(A+B)/C 分别传入动态参数A=1,B=2,C=3
通过字符串替换参数后为:"(1+2)/3"
但是JAVA无法直接对字符串进行转义计算,这时可以通过自己写java写java工具类,但费时费力,尤其像涉及平方,次方计算浪费大量时间,并且可能计算结果不准确,抛出异常等等。
生产实例
这是实际工作中遇到的需求

解决办法

通过查阅各种资料,找到两个解决办法:
1.通过commons-jexl3-3.1.jar解决,但缺点是只能解析常规运算,对于次方计算不支持,如2的1.7次方
2.通过JavaScript的ScriptEngine解决(推荐,支持平方,次方等各种函数)

具体使用办法(方法2)

     //1.字符串公式((current0+101.3,2)^2-(current4+101.3)^2)*100/current3^1.7
     //转为前台计算公式ruleRealize="(Math.pow(current0+101.3,2)-Math.pow(current4+101.3,2))*100/Math.pow(current3,1.7)"
     //2.替换值
     ruleRealize=rule.replace("current0",18.2)
                .replace("current1",16.1)
                .replace("current2",15)
                .replace("current3",13)
      //3引用ScriptEngine包
    ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
    //4.只能用Objiect接受,因为计算可能会抛出异常:如被除数为0,结果无穷大/小
    Object object;
    try {
         object =jse.eval(ruleRealize);
    } catch (ScriptException e) {
        e.printStackTrace();
        return 0.0;
    }
    //5当计算结果为NAN或正负无穷大时默认赋值为0.0
    Double value= Double.valueOf(object.toString());
    if(value.isNaN()||value.isInfinite()){
        object=0.0;
    }
    return Double.valueOf(object.toString());
}

次方计算

21.7 用公式表示为:Math.pow(2,1.7)

扩展

支持三目运算
(current1>current2)?current1:current2

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值