JAVA 计算公式表达式
计算公式表达式—ExpCalcUtils
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExpCalcUtils {
//执行计算公式表达式,变量通过{}括起来
public static Double calcExpFormula(String expFormula, Map<String, Object> varPara) throws Exception {
//变量值替换
Pattern pat = Pattern.compile("\\{(.+?)\\}");
Matcher mat = pat.matcher(expFormula);
StringBuffer ts = new StringBuffer();
while (mat.find()) {
String key = mat.group();
key = key.substring(2, key.length() - 1);
Object valObj = varPara.get(key);
if (valObj == null) valObj = "0";
else if (valObj instanceof Number)
valObj = ((Number) valObj).doubleValue();
String value = valObj.toString();
//%转换成/100
if (value.endsWith("%")) {
value = value.substring(0, value.length() - 1);
value += "/100";
}
mat.appendReplacement(ts, value);
}
mat.appendTail(ts);
//测试计算
ScriptEngine sem = new ScriptEngineManager().getEngineByName("JavaScript");
try {
Double eval = (Double) sem.eval(ts.toString());
if (eval.isInfinite() || eval.isNaN())
throw new Exception("计算结果值无效!");
return eval;
} catch (Exception e) {
String errmsg = "公式表达式,计算失败!";
errmsg += "\n表达式:" + expFormula;
errmsg += "\n计算公式:" + ts;
errmsg += "\n错误信息:" + e.getMessage();
throw new Exception(errmsg);
}
}
}