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);

        }

    }

}

posted @ 2025-07-01 15:05  山䂥进城  阅读(5)  评论(0)    收藏  举报