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