import java.util.Date; public class testcalc2 { String a; int len_of_str; int err; //err 用于发现哪个字符是出错字符就是第一个出错字符串的下标,初始值为-1,表示无错 int index;
public testcalc2(String str) { a = str + "+"; len_of_str = a.length(); err = -1; index = 0; System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%% " + a + len_of_str);
}
public double getnextnum() { int preindex = index, countofdot = 0; if(a.charAt(index) == '-') index++; if(!Character.isDigit(a.charAt(index))) { err = index; return 0; } while((index < len_of_str) && (Character.isDigit(a.charAt(index)) || a.charAt(index) == '.')) { if(a.charAt(index) == '.') { countofdot++; } index++; if(countofdot == 2) { err = index;
return 0; } } return Double.valueOf(a.substring(preindex, index)).doubleValue(); } public char getnextop() { char ch = a.charAt(index); if((ch != '+') && (ch != '-') && (ch != '*') && (ch != '/')) { err = index; ch = ' '; return ch; } index++; return ch;
} public double calcuvalue() { long start = System.currentTimeMillis(); Date d = new Date(); long now = d.getTime(), dif; char ch; boolean minusflag = false, multiflag = false, dividflag = false; double total = 0, next = 0, num = 0; //next used to be * or / while(index < len_of_str) { num = getnextnum(); if(err != -1) { System.out.println("err!?! try to getnextnum but " + " the char at index " + err + " is wrong "); return 0; } System.out.println("index after " + index);
ch = getnextop(); if(err != -1) { System.out.println("err!?! try to getnextop but " + " the char at index " + err + " is wrong "); return 0; } System.out.println("index after " + index);
switch (ch) { case '+':
if(multiflag) { next = next * num; } else if(dividflag) { next = next / num; } else { next = num; } if(minusflag) { next = -next; } total = total + next; minusflag = false; multiflag = false; dividflag = false; break; case '-': if(multiflag) { next = next * num; } else if(dividflag) { next = next / num; } else { next = num; } if(minusflag) { next = -next; } total = total + next; minusflag = true; multiflag = false; dividflag = false; break; case '*': if(multiflag) { next = next * num; } else if(dividflag) { next = next / num; } else { next = num; } multiflag = true; dividflag = false; break;
case '/': if(multiflag) { next = next * num; } else if(dividflag) { next = next / num; } else { next = num; } dividflag = true; multiflag = false; break; default: //impossible ,already has err } System.out.println("ch " + ch + " num " + num + " total " + total + " next " + next + " -" + minusflag + " *" + multiflag + " /" + dividflag); } //while
return total;
} 
|