📄 calculatorjava.java
字号:
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 + -