package cn.com.genius.base.comon.tool;
import java.util.ArrayList;
import java.util.List;public classCalculatorTool {privateString result;privateString formula;private List s=new ArrayList();//中间结果
/** 判断字符是否为运算符,是为真,不是为假
*@param c
*@return
*@author chj
*@date 2015-10-28 上午10:49:43
*@comment*/
privateboolean isOprator(String c) {//TODO Auto-generated method stub
try{if(c.equals("+")||c.equals("-")||c.equals("*")||c.equals("/")||c.equals("(")||c.equals(")"))return true;
}catch(Exception e) {//TODO: handle exception
return false;
}return false;
}/** 判断字符是否为‘)’,是为真,不是为假
*@param c
*@return
*@author chj
*@date 2015-10-28 上午10:51:23
*@comment*/
privateboolean isBracketRight(String c) {//TODO Auto-generated method stub
try{if(c.equals(")"))return true;
}catch(Exception e) {//TODO: handle exception
return false;
}return false;
}/** 判断字符是否为‘(’,是为真,不是为假
*@param c
*@return
*@author chj
*@date 2015-10-28 下午3:34:55
*@comment*/
privateboolean isBracketLeft(String c) {//TODO Auto-generated method stub
try{if(c.equals("("))return true;
}catch(Exception e) {//TODO: handle exception
return false;
}return false;
}/** 中叠式 转 逆波兰式
*@param formula
*@author chj
*@date 2015-10-28 上午11:06:18
*@comment*/
private voidreversePoli(){
List s1=new ArrayList();//运算符
String temp="";//存数字
charc;for(int i=0;i
c=formula.charAt(i);if(isOprator(String.valueOf(c))){//判断是否是运算符,得到完整的一个数temp,放入s2
if(!temp.equals("")){
s.add(temp);
}if(isBracketRight(String.valueOf(c))){//是')',依次弹出s1中的符号到s2中,直到遇到‘(’
for(int j=s1.size()-1;j>-1;j--){if(isBracketLeft(String.valueOf(c))){
s1.remove(j);break;
}if(s1.get(j)!='('){//除了‘(’以外的运算符加入s中
s.add(String.valueOf(s1.get(j)));
}
s1.remove(j);
}
}else{
s1.add(c);
}
temp="";
}else{
temp+=c;
}
}if(!temp.equals("")){
s.add(temp);
}for(int i=0;i
s.add(String.valueOf(s1.get(i)));
}
}/** 逆波兰式计算
*
*@author chj
*@date 2015-10-28 上午11:31:09
*@comment*/
private voidcount_result(){
reversePoli();
List s1=new ArrayList();for(int i=0;i
s1.remove(len-1);
s1.remove(len-2);
s1.add(String.valueOf(re));
}else{
s1.add(s.get(i));
}
}
result=s1.get(0);
}/** 四则运算
*@param num1
*@param num2
*@param op
*@return
*@throws IllegalArgumentException
*@author chj
*@date 2015-10-28 上午11:17:05
*@comment*/
private double calc(double num1, double num2, charop)
throws IllegalArgumentException {switch(op) {case '+':return num1 +num2;case '-':return num1 -num2;case '*':return num1 *num2;case '/':if (num2 == 0) throw new IllegalArgumentException("divisor can't be 0.");return num1 /num2;default:return 0; //will never catch up here
}
}publicString getResult() {
count_result();returnresult;
}public voidsetResult(String result) {this.result =result;
}publicString getFormula() {returnformula;
}public voidsetFormula(String formula) {this.formula =formula;
}
}