初学Java,在工作中需要一个进行公式解析的类。从网上搜到一个相关代码,功能略有欠缺,现修改后能够实现四则运算。为了表示对网友leasion的感谢,并希望能帮助遇到同样问题人,现公开源码如下:
/** * <p>Title: 公式解析类</p> * <p>Description: 实现对包含“()”的表达式进行简单的四则运算。</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: </p> * @author leasion * @version 1.0 */ /** * 原载于:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=14861&tstart=90 * 修改者:lkz * 修改说明: * 1.增加对负数运算支持; * 2.增加对公式的检查; * 3.增加对类似公式(A+B)+(C-D)的支持。 * 4.其它一些小的改动。 * */
import java.util.Vector;
public class FormulaParser { private int leftBracket = 0;//左括号个数 private int rightBracket = 0;//右括号个数 private int startL = 0; private int startR = 0; private double answer = 0; private String strValue=""; private String leftNumber = "0"; private String rightNumber = "0"; public String Msg = ""; private String formula=""; private int[] sym = new int[4]; private Vector list = new Vector();
public FormulaParser(String calRule){ this.setFormula(calRule); } private int getLeftBracket(String calRule) { leftBracket = 0; startL = calRule.indexOf("("); if (startL != -1) { calRule = calRule.substring(startL + 1, calRule.length()); } while (startL != -1) { leftBracket++; startL = calRule.indexOf("("); calRule = calRule.substring(startL + 1, calRule.length()); } return leftBracket; }
private void setLeftBracket(int leftBracket) { this.leftBracket = leftBracket; } public void setFormula(String calRule){ formula=replaceSubtration(calRule.trim()); formula="("+formula+")"; } /* /*为了使公式中支持负数,使用“`”表示减号,使用“-”表示负号 */ private String replaceSubtration(String vstr){ String tmp=""; String result=""; int startS = vstr.indexOf("-"); if (startS !=-1) { if (startS > 0) { tmp = vstr.substring(startS - 1, startS); if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) && !"(".equals(tmp)){ result = result + vstr.substring(0, startS) + "`"; } else result = result + vstr.substring(0, startS + 1); } else result = result + vstr.substring(0, startS + 1); vstr = vstr.substring(startS + 1); } while (startS != -1) { startS = vstr.indexOf("-"); if (startS > 0) { tmp = vstr.substring(startS - 1, startS); if (!"+".equals(tmp) && !"-".equals(tmp) && !"*".equals(tmp) &&!"/".equals(tmp) && !"(".equals(tmp)) result = result + vstr.substring(0, startS) + "`"; else result = result + vstr.substring(0, startS + 1); } else result = result + vstr.substring(0, startS + 1); vstr = vstr.substring(startS + 1); } result+=vstr; return result; }
public String getFormula(){ return formula.replace('`','-').substring(1,formula.length()-1); }
private int getRightBracket(String calRule) { rightBracket = 0; startR = calRule.indexOf(")"); if (startR != -1) { calRule = calRule.substring(startR + 1, calRule.length()); } while (startR != -1) { rightBracket++; startR = calRule.indexOf(")"); calRule = calRule.substring(startR + 1, calRule.length()); } return rightBracket; }
private void setRightBracket(int rightBracket) { this.rightBracket = rightBracket; }
/* /*对比左右括号个数 */ private boolean compareToLR() { int lb = getLeftBracket(formula); int rb = getRightBracket(formula); boolean CTLR = false; if (lb == rb) { Msg = ""; CTLR = true; } else if (lb > rb) { Msg = "左括弧的个数多于右括弧,请检查!"; CTLR = false; } else { Msg = "左括弧的个数少于右括弧,请检查!"; CTLR = false; } return CTLR; } /* /*检查公式中是否存在非法字符如(+、-)等 */ private boolean checkFormula(){ boolean isOk=true; String[] bracket =new String[2]; String[] sign=new String[4]; bracket[0]="("; bracket[1]=")"; sign[0]="+"; sign[1]="`"; sign[2]="*"; sign[3]="/"; String vstr=""; for(int i=0;i<bracket.length;i++){ for(int j=0;j<sign.length;j++){ if (i==0) vstr=bracket[i]+sign[j]; else vstr=sign[j]+bracket[i]; if (formula.indexOf(vstr)>0){ Msg="公式中存在非法字符"+vstr; isOk=false; return isOk; } } } for(int i=0;i<sign.length;i++){ for(int j=0;j<sign.length;j++){ vstr=sign[i]+sign[j]; if (formula.indexOf(vstr)>0){ Msg="公式中存在非法字符"+vstr; isOk=false; return isOk; } } } if (formula.indexOf("()")>0){ Msg="公式中存在非法字符()"; isOk=false; } return isOk; } public boolean checkValid(){ if ((formula==null) || (formula.trim().length()<=0) ) { Msg="请设置属性calRule!"; return false; } return (compareToLR()&&checkFormula()); }
/* /*返回公式执行结果 return double */ public double getResult(){ String formulaStr = "", calRule = ""; double value = 0.0; calRule = this.formula; if (checkValid()) { for (int i = 0; i < leftBracket; i++) { int iStart=calRule.lastIndexOf("(") + 1; formulaStr = calRule.substring(iStart, iStart+calRule.substring(iStart).indexOf(")")).trim(); symbolParse(formulaStr); value = parseString(); iStart=calRule.lastIndexOf("("); int iEnd=calRule.substring(iStart).indexOf(")")+1; calRule = calRule.substring(0,iStart).trim() + value + calRule.substring(iStart+iEnd, calRule.length()).trim(); } } double tmp = Math.pow(10, 10); value = Math.round(value * tmp) / tmp; return value; } public void FormulaStr(String calRule) { String formulaStr = ""; if (checkValid()) { for (int i = 0; i < leftBracket; i++) { formulaStr = calRule.substring(calRule.lastIndexOf("(") + 1, calRule.indexOf(")")).trim(); symbolParse(formulaStr); double value = parseString(); strValue=String.valueOf(value); System.out.println("formulaStr=" + formulaStr); //formulaVal = Double.parseDouble(formulaStr); System.out.println("formulaVal=" + value); calRule = calRule.substring(0, calRule.lastIndexOf("(")).trim() + value + calRule.substring(calRule.indexOf(")") + 1, calRule.length()).trim(); System.out.println("calRule=" + calRule); } } }
/* /*抽取最终括号内数据到List */ private void symbolParse(String str) { list.clear(); for (int i = 0; i < 4; i++) { compareMin(str); while (sym[i] != -1) { String insStr = str.substring(0, sym[i]).trim(); list.add(insStr); insStr = str.substring(sym[i], sym[i] + 1).trim(); list.add(insStr); str = str.substring(sym[i] + 1, str.length()).trim(); compareMin(str); } } if (sym[0] == -1 && sym[1] == -1 && sym[2] == -1 & sym[3] == -1) { list.add(str); } } /* /*循环比较赋SubString起始值 */ private void compareMin(String str) { int sps = str.indexOf("`");//减法subtration sym[0] = sps; int spa = str.indexOf("+");//加法addition sym[1] = spa; int spd = str.indexOf("/");//除法division sym[2] = spd; int spm = str.indexOf("*");//乘法multiplication sym[3] = spm; for (int i = 1; i < sym.length; i++) { for (int j = 0; j < sym.length - i; j++) if (sym[j] > sym[j + 1]) { int temp = sym[j]; sym[j] = sym[j + 1]; sym[j + 1] = temp; } } }
private double parseString() throws NumberFormatException, StringIndexOutOfBoundsException { try{ calculate(); return answer; }catch(Exception e){ Msg="错误:" + e.getMessage(); return 0.0; } }
private void calculate() { /* /*处理除法 */ int spd = list.indexOf("/"); while (spd != -1) { leftNumber = list.get(spd - 1).toString(); rightNumber = list.get(spd + 1).toString(); list.remove(spd - 1); list.remove(spd - 1); list.remove(spd - 1); double ln = Double.valueOf(leftNumber).doubleValue(); double rn = Double.valueOf(rightNumber).doubleValue(); double answer = ln / rn; list.add(spd - 1, String.valueOf(answer)); spd = list.indexOf("/"); } /* /*处理乘法 */ int spm = list.indexOf("*"); while (spm != -1) { leftNumber = list.get(spm - 1).toString(); rightNumber = list.get(spm + 1).toString(); list.remove(spm - 1); list.remove(spm - 1); list.remove(spm - 1); double ln = Double.valueOf(leftNumber).doubleValue(); double rn = Double.valueOf(rightNumber).doubleValue(); double answer = ln * rn; list.add(spm - 1, String.valueOf(answer)); spm = list.indexOf("*"); } /* /*处理减法 */ int sps = list.indexOf("`"); while (sps != -1) { leftNumber = list.get(sps - 1).toString(); rightNumber = list.get(sps + 1).toString(); list.remove(sps - 1); list.remove(sps - 1); list.remove(sps - 1); double ln = Double.valueOf(leftNumber).doubleValue(); double rn = Double.valueOf(rightNumber).doubleValue(); double answer = ln - rn; list.add(sps - 1, String.valueOf(answer)); sps = list.indexOf("`"); } /* /*处理加法 */ int spa = list.indexOf("+"); while (spa != -1) { leftNumber = list.get(spa - 1).toString(); rightNumber = list.get(spa + 1).toString(); list.remove(spa - 1); list.remove(spa - 1); list.remove(spa - 1); double ln = Double.valueOf(leftNumber).doubleValue(); double rn = Double.valueOf(rightNumber).doubleValue(); double answer = ln + rn; list.add(spa - 1, String.valueOf(answer)); spa = list.indexOf("+"); } if (list.size() != 0) { String result = list.get(0).toString(); if (result == null || result.length() == 0) result = "0"; answer = Double.parseDouble(list.get(0).toString()); } } } 小弟初学Java,如有错误望各位网友指正。 
|