Java利用MySql解析计算公式字符串表达式

本文详细阐述了如何通过Java代码解析用户输入的带有空格分隔的字符串表达式,结合参数代码和MySql函数进行计算,适用于BOM场景的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在进行BOM计算等需要用到定义计算公式并进行解析计算,下面是让用户定义字符串表达式,通过解析字符串表达式实现计算,要求参数代码、计算符号、函数之间用空格隔开,参数代码不能是纯数字(如果是纯数字不会进行转换),可以使用MySql的函数。

基础代码如下:

	private BigDecimal optFunStr(FunStrAndParamList reqDTO) {
        BigDecimal result = new BigDecimal("0");

        //用于判断字符串是否可以转换为数值
        String regularExpression = "(^[+-]?[0-9]+)|(^[+-]?[0-9]+\\.[0-9]+)";

        //对应的已经获取了参数值列表
        List<Param> paramList = new ArrayList<>();
        paramList = reqDTO.getParamList();

        //公式
        String formula = reqDTO.getFunStr().replaceAll("\\s{1,}", " ").trim();
        String[] fArrs = formula.split("\\s");
        String formulaTran = "";
        for (String fArr : fArrs) {
            String fArrTran = "";

            //判断是否是运算符
            List<String> opeSymbols = Arrays.asList("+", "-", "*", "/", "=", ">", "<", ">=", "<=", "<>", "(", ")", "()");
            Long check1 = opeSymbols.stream().filter(x -> fArr.equals(x)).count();
            if (check1 > 0L) {
                fArrTran = fArr;
            } else {
                //判断是否为数值
                Boolean check2 = fArr.matches(regularExpression);
                if (check2) {
                    fArrTran = fArr;
                } else {
					Param paramFind = paramList.stream().filter(x ->
                                fArr.trim().equals(x.getParamCode().trim())).findFirst().orElse(null);
                    fArrTran = paramFind.getParamValue().trim();
                }  
            }
            formulaTran = formulaTran + " " + fArrTran;
        }

        //利用解析后的公式计算
        if (0 != formulaTran.length()) {
            result = this.optfunStrMapper.optFunStr(formulaTran);
        }

        return result;
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值