工具类:
package com.hgfr.gfs.common.util;
import com.alibaba.druid.util.StringUtils;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author coffeesweet
* +,-,*,/四则运算的表达式逆波兰解析计算类,精确计算,应用BigDecimal类处理
* 支持负数,但规范除整个表达式第一个数为负数时可以不出现在'('后,其它表达式中间任何位置的
* 负数必须出现在'('后,即:用括号括起来。比如:-3+(-2+1)*10或-3+((-2)+1)*10或(-3)+(-2+1)*10或(-3)+((-2)+1)*10
*/
public class MathExpress {
private final static String OP1 = "+";
private final static String OP2 = "-";
private final static String OP3 = "*";
private final static String OP4 = "/";
private final static String OPSTART = "(";
private final static String OPEND = ")";
//最原始的四则运算式
private String expBase;
//经过初始化处理后的四则运算式
private String expInited;
//精度
private int precision=200;
//取舍模式
private RoundingMode roundingMode = RoundingMode.HALF_UP;
//精度上下文
private MathContext mc;
//四则运算解析
private List<String> expList = new ArrayList<>();
//存放逆波兰表达式
private List<String> rpnList = new ArrayList<>();
public MathExpress init(String expBase) {
this.expBase = expBase;
this.mc = new MathContext(precision,roundingMode);
this.expInited = initExpress(expBase);
StringTokenizer st = new StringTokenizer(this.expInited,"+-*/^%()",true);
while(st.hasMoreElements()){
this.expList.add(st.nextElement().toString().trim());
}
this.rpnList = initRPN(this.expList);
return this;
}
public String getExpBase() {
return expBase;
}
public void setExpBase(String expBase) {
this.expBase = expBase;
}
public String getExpInited() {
return expInited;
}
public void setExpInited(S