⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculatorjava.java

📁 计算简单字符串的java类 例如:IF:(1>0)TRUE(1)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			stackElement[1] = "IIF";
			stackElement[2] = null;
			this.inStack(stackElement);
			return;
		}
		
		if (this.cussVariable == null) {
			this.isOver = true;
			this.errMsg = "\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置" + this.nextElement + " 语法错误  "+errMsg;
			return;
		}
		try {
			this.adjustLevel(ch);
		} catch (Exception e) {
			this.isOver = true;
			return;
		}
		if("TRUEFALSE".indexOf(ch)<0){
			stackElement[0] = this.cussVariable.toString();
			stackElement[1] = ch;
			stackElement[2] = null;

			this.inStack(stackElement);
		}
		
		this.cussVariable = null;
	}

	// 数字
	private void addDigit() {
		if(this.cussVariable!=null){
			this.errMsg="\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置"+this.nextElement+"发生错误,请检查公式! "+errMsg;
			this.isOver=true;
			return;
		}
		StringBuffer temps = new StringBuffer();
		temps.append(this.elements[this.nextElement++]);
		boolean isnone = false;
		while (!isnone) {
			if (this.nextElement >= this.elements.length) {
				this.isOver = true;
				break;
			} else if (Character.isDigit(this.elements[this.nextElement])||this.elements[this.nextElement]=='.') {
				temps.append(this.elements[this.nextElement++]);
			} else {
				isnone = true;
			}
		}
		this.cussVariable = new Double(temps.toString());
	}

	// 调用变量
	private void transferVariable() {
		if (this.key_value == null) {
			this.errMsg = "错误:使用了未经定义的变量  "+errMsg;
			return;
		}
		StringBuffer temps = new StringBuffer();
		temps.append(this.elements[this.nextElement++]);
		boolean isnone = false;
		while (!isnone) {
			if (this.nextElement >= this.elements.length) {
				this.isOver = true;
				break;
			} else if ((Character.isLetter(this.elements[this.nextElement]) || this.elements[this.nextElement] == '_')) {
				temps.append(this.elements[this.nextElement++]);
			} else {
				isnone = true;
			}
		}
		Double r = (Double) this.key_value.get(temps.toString());

		if (r != null) {
			this.cussVariable = r;
		} else {
			this.isOver = true;
			this.errMsg = "\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置" + this.nextElement + " 语法错误 :变量未定义 "+errMsg;
		}
	}
	
	// 进栈
	private void inStack(Object o) {
		if (this.stack == null)
			stack = new Vector();
		stack.add(0, o);
	}

	// 出栈
	private String[] outStack() {
		String[] rv = null;
		rv = (String[]) this.stack.remove(0);
		return rv;
	}

	// 返回优先级 + - * /
	private int isLevel(String ch) {
		int rv = 0;
		if ("+".equals(ch) || "-".equals(ch)) {
			rv = 3;
		} else if ("/".equals(ch) || "*".equals(ch)){
			rv = 4;			
		} else if (">".equals(ch)||"<".equals(ch)||">=".equals(ch)||"<=".equals(ch)||"<>".equals(ch)){
			rv = 2;			
		} else if("|".equals(ch)||"&".equals(ch)){
			rv = 1;
		} else if(ch.indexOf("IIF")>=0){
			rv = 6;
		} else if("TRUE".equals(ch)||"FALSE".equals(ch)){
			rv = 5;
		}
		return rv;
	}
	private boolean isLevel2(String ch){
		boolean rv = false;
		for(int i=0 ;i<this.keyWords.length;i++){
			if(ch.equals(this.keyWords[i])){
				rv=true;
				return true;
			}
		}
		return rv ;
	}
	// 调整优先级
	private void adjustLevel(String ch) throws Exception {
		if (this.cussVariable == null){
			this.isOver=true;
			this.errMsg = "\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置" + this.nextElement + " 语法错误  "+errMsg;
			throw new Exception(this.errMsg);
		}
		if (this.stack.size() < 1)
		return;
		String[] stackelement = (String[])stack.get(0);
		if (keyWord4.indexOf(stackelement[1])>=0) {
			if (this.isLevel(stackelement[1]) >= this.isLevel(ch)) {
				stackelement[2] = this.cussVariable.toString();
				this.cussVariable = this.clrStack(stackelement);
				
				if(keyWord3.indexOf(stackelement[1])>=0){
					this.stack.remove(0);
				}
				if("IIF".equals(stackelement[1])&&stackelement[2]!=null){
					this.stack.remove(0);
				}

			}
		}
	}
//	检查栈中的值是否含有异常,和可以忽略异常的堆栈。
	private Double expCheckStack(String[] stackelement){
		double rv = 0;
		String f = stackelement[1];
		String[] iifElement =null;
		if(stack.size()>0){    
			iifElement =(String[]) stack.get(0);
		}	
		if(f.split(":").length<2){
			if("1.0".equals(stackelement[2])||"0.0".equals(stackelement[2])){
				f+=":"+stackelement[2];
				stackelement[2] = null;
				stackelement[1] = f;
				iifElement=stackelement;
				return null;
			}else{
				this.errMsg = "条件计算结果错误 IIF:"+stackelement[2]+"  "+errMsg;
				this.isOver=true;
			}
		}else if(stackelement[0]==null){
				stackelement[0]=stackelement[2];
				stackelement[2] = null;
				iifElement=stackelement;
				return null;
		}else{
			if((f.split(":"))[1].equals("1.0")){
				rv = Double.parseDouble(stackelement[0]);
				iifElement=stackelement;
				return new Double(rv);
			}else if((f.split(":"))[1].equals("0.0")){
				rv = Double.parseDouble(stackelement[2]);
				iifElement=stackelement;
				return new Double(rv);
			}else{
				this.errMsg = "条件计算结果错误 IIF:"+stackelement[2]+"   "+errMsg;
				this.isOver=true;
			}
		}

		return new Double(rv);
	}
	// 计算栈中表达式的值
	private Double clrStack(String[] stackelement){
		double rv = 0;
		try {
			String f = stackelement[1];
			if(f.indexOf("IIF")>=0){
				return expCheckStack(stackelement);
			}else{
				if(stackelement[0]!=null){
					if("NaN".equals(stackelement[0]))return new Double(Double.NaN);
				}else if(stackelement[2]!=null){
					if("NaN".equals(stackelement[2]))return new Double(Double.NaN);
				}
			}
			if ("+".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 + v2;
				return new Double(rv);
			} else if ("-".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 - v2;
				return new Double(rv);
			} else if ("*".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 * v2;
				return new Double(rv);
			} else if ("/".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				if(v2==0){
					this.excMsg = "除法错误: "+v1+"/"+v2+"  "+errMsg;
					return new Double(Double.NaN);					
				}else{
					rv = v1 / v2;
					return new Double(rv);
				}
			} else if ("=".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 == v2?1:0;
				return new Double(rv);
			} else if ("<".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 < v2?1:0;
				return new Double(rv);
			} else if (">".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 > v2?1:0;
				return new Double(rv);
			} else if ("<>".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 != v2?1:0;
				return new Double(rv);
			} else if (">=".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 >= v2?1:0;
				return new Double(rv);
			} else if ("<=".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 <= v2?1:0;
				return new Double(rv);
			} else if ("&".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 + v2==2?1:0;
				return new Double(rv);
			} else if ("|".equals(f)) {
				double v1 = Double.parseDouble(stackelement[0]);
				double v2 = Double.parseDouble(stackelement[2]);
				rv = v1 + v2>0?1:0;
				return new Double(rv);
			}
			
		} catch (Exception e) {
			this.errMsg=e.getLocalizedMessage()+"运算符操作错误! "+stackelement[0]+stackelement[1]+stackelement[2]+"  "+errMsg;
			this.isOver = true;
			e.printStackTrace();
		}
		return new Double(rv);
	}
	//判断IIF
	private void IIFStat(){
		String opr;
		try {
			opr = this.checkKeyWord();
			this.connOperation(opr);
			this.nextElement++;
		} catch (Exception e) {
			this.errMsg="在计算:IIF公式中产生错误 "+"  "+errMsg;
			this.isOver = true;
			e.printStackTrace();
		}
		
	}
	//检查关键字
	private String checkKeyWord()throws Exception{
		String rv = null;
		this.nextElement++;
		StringBuffer temps = new StringBuffer();
		if(this.keyWords2.indexOf(this.elements[this.nextElement])>=0){
			temps.append((this.elements[this.nextElement]));
			while(true){
				if(this.keyWords2.indexOf(this.elements[this.nextElement+1])>=0){
					temps.append((this.elements[++this.nextElement]));
				}else{
					break;
				}
			}
			rv=temps.toString();
			if(!this.isLevel2(rv)){
				this.errMsg = "\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置" + this.nextElement + " 语法错误"+"  "+errMsg;;
				this.isOver = true;
				return null;
			}
		}else if(Character.isLetter(this.elements[this.nextElement])){
			temps.append(this.elements[this.nextElement]);
			while(true){
				if(Character.isLetter(this.elements[this.nextElement+1])){
					temps.append(this.elements[++this.nextElement]);
				}else{
					break;
				}
			}
			rv = temps.toString();
		}else{
			this.errMsg ="\""+ this.elements[this.nextElement<this.elements.length?this.nextElement:this.nextElement-1]+"\" 位置" + this.nextElement + " 语法错误 "+"  "+errMsg;
			this.isOver = true;
			throw new Exception(errMsg);
		}
		return rv ;
	}
}//9-12-10:00

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -