天天看点

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

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

问题背景描述

在实际开发过程中,需要通过配置表动态配置计算公式以及动态传入值,当前java会自动将字符串公式转义无法直接计算其结果。

例如:有公式:(A+B)/C 分别传入动态参数A=1,B=2,C=3

通过字符串替换参数后为:"(1+2)/3"

但是JAVA无法直接对字符串进行转义计算,这时可以通过自己写java写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