支持自定义公式计算的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] 中的 98 String name = value.substring(leftzhon+1,rightzhon); //把98从 string 转化为 98 int number = Integer.valueOf(name).intValue(); //求值 double number3 = zxmnumber(number,getXb(),getWord()); if(number3 == -99999999.0) { return "-999999.0"; } //把zxm[98]替换为 number3 value = 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;//lastrightBracket int newlength = value.length(); int i = leftBracket+2; while(i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值