支持自定义公式计算的Java算法。
参与IBM Maximo的开发。再做公式计算的时候,为了实现一个复杂的公式计算。例如:sin(sin(9+2)+30)+sqrt(4)等 带自定义公式的计算。对网上的代码进行修改。 网上有:FormulaParser.类如下/** *
Title: 公式解析类
*Description: 实现对包含"()"的表达式进行简单的四则运算。
*Copyright: Copyright (c) 2007
*Company:
* @author zhangtianfeng 引用 * @version 1.0 *//*** 原载于:http://www.blogjava.net/linlin2005/archive/2006/08/02/61315.html* 修改者:zhangtianfeng* 修改说明:* 1.增加对负数运算支持;* 2.增加对公式的检查;* 3.增加对类似公式(A+B)+(C-D)的支持。* 4.其它一些小的改动。* * 缺点不支持(A+B)C**/import java.rmi.RemoteException;import java.util.Vector;import psdi.util.MXException;/** * @author zhangtianfeng * */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; System.out.println("*****************"+result); 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;i0){ Msg="公式中存在非法字符"+vstr; isOk=false; return isOk; } } } for(int i=0;i0){ 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(); } } System.out.println(Msg); 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()); } } }这个类文件不是我写的:主要实现基本的数学算式:例如:1+2*(2+2)为了实现我上面所说的复杂公式。我再写了个FormulaParser2。目的实现自定函数的转化。把所有的复杂公式转化为简单的数学算式。代码如下。/** *Title: 公式解析类
*Description: 实现对包含"()"的表达式进行简单的四则运算。
*Copyright: Copyright (c) 2007
*Company:
* @author zhangtianfeng * @version 1.0 *//** * 基本功能 * 公式解析类,可以计算包含加号(+),减号(-),乘号(*),除号(/),乘方(^),取模(%)以及括号的公式. * * 1."+","-"号前是非数字时,将被认为是正、负号.; * 2.对公式的检查; * 3.对类似公式(A+B)+(C-D)的支持。 * 4.对自定义的公式的支持sin(30)+cos(40)*(1+2)+max(30,40)。 * 5.括号前后直接加数字,将被认为是乘以该数字.能够识别 A(B+C)D 为A*(B+C)*D * 6.当两个运算符连用(例如"^*"),将使用后面的运算符("+""-"除外).若前面的运算符是"+","-",将被认为是+1,-1. * * * *///import cs1.Keyboard;import java.rmi.RemoteException;import psdi.mbo.MboRemote;import psdi.mbo.MboSetRemote;import psdi.security.UserInfo;import psdi.server.MXServer;import psdi.util.MXApplicationException;import psdi.util.MXException;import psdi.webclient.system.beans.AppBean;/** * @author zhangtianfeng * */public class FormulaParser2{ //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 = ""; public String formula=""; //具体的公式// private int[] sym = new int[4];// private Vector vec = new Vector(); public MboRemote mbo; private int length =0; //公式字符串的长度 private boolean flg = false; //判断公式是否合法,true合法,false不合法 private String xb =""; //试验相别 private String word = ""; //试验工单编号/** * @throws MXException * @throws RemoteException * */ public FormulaParser2() throws RemoteException, MXException {//mbo = mbo1;// TODO Auto-generated constructor stub//for(int i=0;i0){ //如果是左括号isrightBracketSecond = checkrightBracket(second);issecondfig = sign(second);}//System.out.println("second = " + second);if(j>1){ //如果是左括号isrightBracketFirst = checkrightBracket(calRule.substring(i-1, i));first = first+calRule.substring(i-1, i);//first = ewCalRule;//System.out.println("first = " + first);}//ewCalRule = ewCalRule + second;if(isrightBracketFirst && j>0 && !isrightBracketSecond && !issecondfig){ewCalRule = first +"*"+ second;}else{ewCalRule = ewCalRule + second;}}calRule =ewCalRule;System.out.println("右括号验证:"+calRule);return calRule;}/* * * 如果算式为A(B+C) 自动把更改为A*(B+C) A必须为数字 * 10(9+2) 改为10*(9+2) * sin(90)(9+2) 改为sin(90)*(9+2) * 如sin(30) 不能改为sin*(30) * ((9+2)*2+(9+2)/2)*2 能够识别(( */private String ChangeleftBracket(String calRule){String first = "";String second = "";String ewCalRule ="";boolean isleftBracketFirst = false; //是否有"(",")"符号boolean isleftBracketSecond = false;length = calRule.length();//boolean isrightBracketFirst =false;//boolean isrightBracketSecond =false;//阿拉伯数字判断boolean isfirstfig = false; //boolean issecondfig = false;int j = 0; //下一个字符个数的标志for(int i=0; i0){//如果是左括号 isleftBracketSecond = checkleftBracket(second); //如果是右括号 //isrightBracketSecond = checkrightBracket(second); //issecond = Numbermatches(second);}//System.out.println("second = " + second);if(j>1){isfirstfig = Numbermatches(calRule.substring(i-1, i));//如果是左括号isleftBracketFirst = checkleftBracket(calRule.substring(i-1, i));//如果是右括号//isrightBracketFirst = checkleftBracket(calRule.substring(i-1, i));//first = first+calRule.substring(i-1, i);first = ewCalRule;//System.out.println("isfirstfig ==" + isfirstfig);//isrightBracketFirst = checkrightBracket(first);//System.out.println("first = " + first);}//System.out.println("i = " + i);//确保在判断符号时候,已经开始在第2位上//从"("开始判断if(isleftBracketSecond && j>0 && !isleftBracketFirst && isfirstfig){//System.out.println("左括号++");ewCalRule = first +"*"+ second;}else{ewCalRule = ewCalRule + second;}//System.out.println("---------------------------");}calRule = ewCalRule;System.out.println("左括号验证:"+calRule);return calRule;}/* * 如果是符号 "(" 的话 返回true,否则返回false */private boolean checkleftBracket(String sing){if(sing.equals("(")){return true;}return false;}/* * 如果是符号 ")" 的话 返回true,否则返回false */private boolean checkrightBracket(String sing){if(sing.equals(")")){return true;}return false;} //判断字符串是不是 阿拉伯数字和括号public boolean Numbermatches(String value){if(value.matches("0")||value.matches("1") || value.matches("2")|| value.matches("3")|| value.matches("4")|| value.matches("5")|| value.matches("6")|| value.matches("7")|| value.matches("8")|| value.matches("9") || value.equals(")") ){return true;}return false;}public boolean Number(String value){if(value.matches("0")||value.matches("1") || value.matches("2")|| value.matches("3")|| value.matches("4")|| value.matches("5")|| value.matches("6")|| value.matches("7")|| value.matches("8")|| value.matches("9") ){return true;}return false;}//确定公式里面的加减符号public boolean sign(String value){if(value.equals("*") || value.equals("/")|| value.equals("+")|| value.equals("-")|| value.equals("%") || value.equals(",")){return true;}return false;}public boolean sign2(String value){ if(value.indexOf("+")>=0) { return true; } if(value.indexOf("-")>=0) { return true; } if(value.indexOf("/")>=0) { return true; } if(value.indexOf("*")>=0) { return true; } if(value.indexOf("%")>=0) { return true; } return false;}/** * 能够识别自定义的函数求值:例如sin(90)能够求值 * @throws MXException * @throws RemoteException * */public double CheckFuncationName(String value) throws RemoteException, MXException{double number = 0,number2=0;//int newlength = value.length();int leftBracket = value.indexOf("(");int rightBracket = value.indexOf(")");boolean flgsin = false;int sig =value.indexOf(",");String name = value.substring(0,leftBracket);String numberst,numberst2;//int number3;//int leftz,rightz;if(name.equals("sin")){rightBracket = lastrightBracket(value,2);numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst);if(flgsin || sign2(numberst) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst));number = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number = Double.valueOf(numberst).doubleValue();}if(number == 180){number = 0;}else{number =Math.sin(number/57.29619266);}}if(name.equals("cos")){rightBracket = lastrightBracket(value,2);numberst = value.substring(leftBracket+1,rightBracket);flgsin= checkname(numberst);if(flgsin || sign2(numberst) ) {//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst));number = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number = Double.valueOf(numberst).doubleValue();}if(number == 90){number = 0;}else{ number =Math.cos(number/57.29619266);}}if(name.equals("pow")){rightBracket = lastrightBracket(value,2);numberst = value.substring(leftBracket+1,sig); flgsin= checkname(numberst);if(flgsin || sign2(numberst) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst));number = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number = Double.valueOf(numberst).doubleValue();}numberst2 =value.substring(sig+1,rightBracket); flgsin= checkname(numberst2);if(flgsin || sign2(numberst2) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst2));number2 = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number2 = Double.valueOf(numberst2).doubleValue();}//number = Double.valueOf(numberst).doubleValue();//number2 = Double.valueOf(numberst2).doubleValue();number =Math.pow(number,number2);}if(name.equals("ACos")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); } //number = Double.valueOf(numberst).doubleValue();number =Math.acos(number)*57.29619266;}if(name.equals("sqrt")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); }//number = Double.valueOf(numberst).doubleValue();number =Math.sqrt(number);}if(name.equals("log")){rightBracket = lastrightBracket(value,2); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); } //number = Double.valueOf(numberst).doubleValue();if(number<=0){ throw new MXApplicationException("", "log()里面不能输入小于等于0 的数字");}number =Math.log(number);}if(name.equals("ceil")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); } //number = Double.valueOf(numberst).doubleValue();number =Math.ceil(number);} if(name.equals("cube")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); } //number = Double.valueOf(numberst).doubleValue();number =number*number;} if(name.equals("atan")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); }//number = Double.valueOf(numberst).doubleValue();number =Math.atan(number)*57.29619266;} if(name.equals("ASin")){rightBracket = lastrightBracket(value,3); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); }//number = Double.valueOf(numberst).doubleValue();number =Math.asin(number)*57.29619266;} if(name.equals("abs")){rightBracket = lastrightBracket(value,2); numberst = value.substring(leftBracket+1,rightBracket); flgsin= checkname(numberst); if(flgsin || sign2(numberst) ) { //setFormula(numberst); //System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst)); FormulaParser fro = new FormulaParser(setFormula(numberst)); number = fro.getResult(); //System.out.println("=====================里面计算结果==========" + setFormula(numberst)); }else{ number = Double.valueOf(numberst).doubleValue(); }//number = Double.valueOf(numberst).doubleValue();number =Math.abs(number);} if(name.equals("min")){rightBracket = lastrightBracket(value,2);numberst = value.substring(leftBracket+1,sig); flgsin= checkname(numberst);if(flgsin || sign2(numberst) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst));number = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number = Double.valueOf(numberst).doubleValue();}numberst2 =value.substring(sig+1,rightBracket); flgsin= checkname(numberst2);if(flgsin || sign2(numberst2) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst2));number2 = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number2 = Double.valueOf(numberst2).doubleValue();}//number = Double.valueOf(numberst).doubleValue();//number2 = Double.valueOf(numberst2).doubleValue();number =Math.min(number,number2);}if(name.equals("max")){rightBracket = lastrightBracket(value,2);numberst = value.substring(leftBracket+1,sig); flgsin= checkname(numberst);if(flgsin || sign2(numberst) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst));number = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number = Double.valueOf(numberst).doubleValue();}numberst2 =value.substring(sig+1,rightBracket); flgsin= checkname(numberst2);if(flgsin || sign2(numberst2) ){//setFormula(numberst);//System.out.println("发现函数里面还有公式嵌套" + setFormula(numberst));FormulaParser fro = new FormulaParser(setFormula(numberst2));number2 = fro.getResult();//System.out.println("=====================里面计算结果==========" + setFormula(numberst));}else{number2 = Double.valueOf(numberst2).doubleValue();}//number = Double.valueOf(numberst).doubleValue();//number2 = Double.valueOf(numberst2).doubleValue();number =Math.max(number,number2);}return number;} // 把公式一个个分解/** * 例如sin(90)+cos(20) * 这个方法主要确定有几个函数,并且把这些函数单独拿出来使用 * @throws MXException * @throws RemoteException */public boolean spiltFuncation(String value) throws RemoteException, MXException{ int newlength = value.length(); String name; double ruslt; int number = 0; int i=0; number = value.indexOf("sin"); if(number >=0) { // i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("sin中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("cos中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { // i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("pow中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("ACos中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("sqrt中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { // i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("log中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("pow中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+1=0) { //i = rightnumber(number,newlength); i = lastrightBracket(value,number+2); //System.out.println("pow中的)的位置"+i); name = value.substring(number,i+1); System.out.println("找到位置 "+name); System.out.println("计算结果"+CheckFuncationName(name)); ruslt = CheckFuncationName(name); if(i+10) { //System.out.println("子项目没有录数据,返回一个无限小的数字"+mboSetRemote.getMbo(0).getString("NUMVALUE")); if(mboSetRemote.getMbo(0).getString("NUMVALUE").equals("")) { System.out.println("子项目没有录数据,返回一个无限小的数字"); return -999999.0; } number = mboSetRemote.getMbo(0).getDouble("NUMVALUE"); System.out.println("=====================***=========="+number); }else{ throw new MXApplicationException("错误提示: ", "你输入的子项目不存在 zxm["+zxmid+"]"); } return number;}//用地递归找到zxm[90]public String siZxm(String value) throws RemoteException, MXException{int i = value.indexOf("zxm");int newlength = value.length();int rightzhon = value.indexOf("]");if(i>=0){if(spiltZxm(value.substring(i,rightzhon+1)).equals("-999999.0")){return "-999999.0";}value = value.substring(0,i)+spiltZxm(value.substring(i,rightzhon+1))+value.substring(rightzhon+1,newlength);//System.out.println("=====================+++============"+value);}i = value.indexOf("zxm");if(i>=0){return siZxm(value);}return value;}/* * 如果有子项目存在,帮zxm[id] + 试验相别 +工单编号 */public String spiltZxm(String value) throws RemoteException, MXException{//int i = value.indexOf("zxm");int leftzhon = value.indexOf("[");int rightzhon = value.indexOf("]");//提取 zxm[98] 中的 98String name = value.substring(leftzhon+1,rightzhon);//把98从 string 转化为 98int number = Integer.valueOf(name).intValue();//求值 double number3 = zxmnumber(number,getXb(),getWord());if(number3 == -99999999.0){return "-999999.0";}//把zxm[98]替换为 number3value = String.valueOf(number3);return value;}public String getWord() {return word;}public void setWord(String word) {this.word = word;}public String getXb() {return xb;}public void setXb(String xb) {this.xb = xb;}public MboRemote getMbo() {return mbo;}public void setMbo(MboRemote mbo) {this.mbo = mbo;}/* * 检查是否有子定义函数的存在 */public boolean checkname(String name){if(name.indexOf("sin")>=0) return true;if(name.indexOf("cos")>=0) return true;if(name.indexOf("pow")>=0) return true;if(name.indexOf("ACos")>=0) return true;if(name.indexOf("sqrt")>=0) return true;if(name.indexOf("log")>=0) return true;if(name.indexOf("ceil")>=0) return true;if(name.indexOf("cube")>=0) return true;if(name.indexOf("cot")>=0) return true;if(name.indexOf("atan")>=0) return true;if(name.indexOf("ASin")>=0) return true;if(name.indexOf("abs")>=0) return true;if(name.indexOf("min")>=0) return true;if(name.indexOf("max")>=0) return true;return false;}/* * 根据这个函数 返回对应')'的 数字 * 例如sin( zxm[98] + cos(20))+sin(90) * sin((2+2)*2)+cos(90) * 放回第一个sin后'('所对应的 ')'的数值 */public int lastrightBracket(String value,int leftBracket){int numberleft = 1;int numberright =0;int number = leftBracket;//lastrightBracketint newlength = value.length();int i = leftBracket+2;while(i+numberright); } if(numberleft == numberright) { number = i; i = newlength; return number; }else{ i++; } //i++; }return number;}}在里面我加了些 Maximo系统的 异常处理机制。如果要单独使用。可以把那些异常全去掉。包括导入的包。如果需要实现输入机制。可以使用包 cs1.Keyboard 网上有。我这里就不提供了。本人第一发帖,不足之处大家体谅,以后完善。 1 楼 zhangtianfeng 2008-01-16 怎么 代码不对齐的??? 2 楼 max.h.chen 2008-01-17 有开源的,叫JEval 3 楼 zhangtianfeng 2008-01-17 谢谢 你提示的JEval开源包。我执行里面的例子,发现,java.lang.UnsupportedClassVersionError: net/sourceforge/jeval/EvaluationException (Unsupported major.minor version 50.0)