天天看點

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