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