热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java对字符串形式的公式进行计算

使用场景:需要执行一些可配置的公式来计算结果例如:某些公司工资的计算,分各种计算方案,拿到对应字段替换到公式中进行结果计算依

使用场景: 需要执行一些可配置的公式来计算结果
例如:某些公司工资的计算,分各种计算方案,拿到对应字段替换到公式中进行结果计算


依赖

<dependency><groupId>org.apache.commonsgroupId><artifactId>commons-jexl3artifactId><version>3.1version>dependency><dependency><groupId>org.apache.commonsgroupId><artifactId>commons-textartifactId><version>1.3version>dependency>

代码

package com.hzr;import org.apache.commons.jexl3.*;
import org.apache.commons.text.StringSubstitutor;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;import java.math.BigDecimal;
import java.util.*;public class MyTest {public static void main(String[] args) {Map<String,Object> varMap &#61; new HashMap<>();varMap.put("绩效工资",1000);varMap.put("年平均月工作日",21.75);varMap.put("请假天数",20);/*** 方法一*/String ex &#61; "${绩效工资}/${年平均月工作日}*${请假天数}";System.out.println(jexlEval(ex,varMap));/*** 方法二*/try {System.out.println(jsEval(ex,varMap));} catch (ScriptException e) {e.printStackTrace();}/*** 方法三*/Map<String,Object> varMap2 &#61; new HashMap<>();varMap2.put("a",1000);varMap2.put("b",21.75);varMap2.put("c",20);String ex2 &#61; "a/b*c";System.out.println(jexlEval2(ex2,varMap2));}/*** 占位符 &#43; ScriptEngine 方式* &#64;param formula* &#64;return* &#64;throws ScriptException*/public static Object jsEval(String formula,Map<String,Object> varMap) throws ScriptException {formula &#61; new StringSubstitutor(varMap).replace(formula);ScriptEngine jse &#61; new ScriptEngineManager().getEngineByName("Javascript");Object evaluate &#61; jse.eval(formula);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}/*** 占位符公式 &#43; Jexl 支持中文占位符* &#64;param formula* &#64;param varMap* &#64;return*/public static Object jexlEval(String formula, Map<String,Object> varMap){formula &#61; new StringSubstitutor(varMap).replace(formula);JexlEngine jexlEngine &#61; new JexlBuilder().create();JexlExpression jexlExpression &#61; jexlEngine.createExpression(formula);Object evaluate &#61; jexlExpression.evaluate(null);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}/*** 变量公式 &#43; JexlContext 不支持中文公式* &#64;param formula* &#64;param varMap* &#64;return*/public static Object jexlEval2(String formula, Map<String,Object> varMap){JexlContext jc &#61; new MapContext();varMap.forEach((key,value) ->{jc.set(key,value);});JexlEngine jexlEngine &#61; new JexlBuilder().create();JexlExpression jexlExpression &#61; jexlEngine.createExpression(formula);Object evaluate &#61; jexlExpression.evaluate(jc);return new BigDecimal(evaluate.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();}
}

输出结果

919.54
919.54
919.54


推荐阅读
author-avatar
不爽我就来吐槽_320
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有