java处理字符串公式运算

  在改进一个关于合同的项目时,有个需求,就是由于合同中非数据项的计算公式会根据年份而进行变更,而之前是将公式硬编码到系统中的,只要时间一变,系统就没法使用了,因此要求合同中各个非基础数据的项都能自定义公式,根据设置的公式来自动生成报表和合同中的数据。

  显然定义的公式都是以字符串来存储到数据库的,可是javaeeee=dddd*20,而最终的公式可能是这样:eeee*-12+13-dddd+24。可知eeee是一个中间公式,所以一个公式的计算需要知道中间公式和基础数据。

这好像可以使用一个解释器模式来解决,但是我没有成功,因为括号的优先级是一个棘手的问题,后来又想到可以使用freemarker类似的模板引擎或者java6之后提供的ScriptEngine脚本引擎,做了个实验,脚本引擎可以解决,但是这限制了必须使用java6及以上的版本。最终功夫不负有心人,终于找到了完美解决方案,即后缀表达式。我们平时写的公式称作中缀表达式,香港服务器租用,计算机处理起来比较困难,所以需要先将中缀表达式转换成计算机处理起来比较容易的后缀表达式。

将中缀表达式转换为后缀表达式具体算法规则:见后缀表达式

b.

c.若为除括号外的其他运算符,美国服务器,当其优先级高于栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。

·当扫描的中缀表达式结束时,栈中的的所有运算符出栈; 

我们提出的要求设想是这样的:

FormulaTest { 2 @Test testFormula() {Map<String, BigDecimal> values = new HashMap<String, BigDecimal>(); 6values.put(“dddd”, BigDecimal.valueOf(56d));Map<String, String> formulas = new HashMap<String, String>();10formulas.put(“eeee”, “#{dddd}*20”);String expression = “#{eeee}*-12+13-#{dddd}+24”;1415BigDecimal result = FormulaParser.parse(expression, formulas, values);16Assert.assertEquals(result, BigDecimal.valueOf(-13459.0));17 }18 },香港服务器为我祈祷平安就好。我的旅行,会有你们的故事陪伴,所以我不会孤单。放心吧。

java处理字符串公式运算

相关文章:

你感兴趣的文章:

标签云: