|
0正文 - private TextView mNumberText;
/** 格式化數(shù)據(jù) */
private static final DecimalFormat mFormat = new DecimalFormat(
"###############.######");
/** 堆棧 */
private Stack<String> mMathStack = new Stack<String>();
/** 操作數(shù) 入棧 */
private void push(char obj) {
final int size = mMathStack.size();
// 清除
if (c == obj) {
mMathStack.clear();
mNumberText.setText("0");
return;
}
// 操作符號(hào)
if (+ == obj || - == obj || * == obj || / == obj || = == obj) {
switch (size) {
case 0:
break;
case 2:
if (= != obj)
mMathStack.set(1, obj + "");// 同時(shí)輸入兩個(gè)操作符,后面的操作符替換前面的
break;
case 1:
if (= != obj)
mMathStack.push(obj + "");
break;
case 3:
String preResult = mFormat.format(calc());
mMathStack.push(preResult);
if (= != obj)
mMathStack.push(obj + "");
mNumberText.setText(preResult);
break;
}
return;
}
String str = "";
int location = 0;
switch (size) {
case 0:
mMathStack.push("");
case 1:
str = mMathStack.peek();
break;
case 2:
mMathStack.push("");
case 3:
location = 2;
str = mMathStack.peek();
break;
}
int len = str.length();
if (d == obj) {
// 刪除
if (len > 1)
str = str.substring(0, len - 1);
else if (len == 1)
str = "0";
} else if (f == obj) {
if ("0".equals(str) || len == 0) {
return;
} else if (str.charAt(0) == -) {
str = str.replace(-, ).trim();
} else {
str = - + str;
}
} else {
if (. == obj) {
if (str.indexOf(".") > 0)
return;
} else if (0 == obj) {
if (str.length() == 0 || str.equals("0"))
return;
}
str += obj;
}
if (. != obj)
str = mFormat.format(parseDouble(str));
mMathStack.set(location, str);
mNumberText.setText(str);
}
private double calc() {
double result = 0.0D;
if (mMathStack.size() == 3) {
double right = parseDouble(mMathStack.pop());
String oper = mMathStack.pop();
double left = parseDouble(mMathStack.pop());
if ("+".equals(oper)) {
result = left + right;
} else if ("-".equals(oper)) {
result = left - right;
} else if ("*".equals(oper)) {
result = left * right;
} else if ("/".equals(oper)) {
if (right != 0.0D)
result = left / right;
}
}
return result;
}
/** 解析文本數(shù)據(jù) */
private double parseDouble(String str) {
try {
return Double.parseDouble(str);
} catch (NumberFormatException e) {
return 0.0D;
}
}
/** 點(diǎn)擊事件 */
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnDivi:// 除
push(/);
break;
case R.id.btnMult:// 乘
push(*);
break;
case R.id.btnMinus:// 減
push(-);
break;
case R.id.btnPlus:// 加
push(+);
break;
case R.id.btnClear:// C
push(c);
break;
case R.id.btn0:
push(0);
break;
case R.id.btn1:
push(1);
break;
case R.id.btn2:
push(2);
break;
case R.id.btn3:
push(3);
break;
case R.id.btn4:
push(4);
break;
case R.id.btn5:
push(5);
break;
case R.id.btn6:
push(6);
break;
case R.id.btn7:
push(7);
break;
case R.id.btn8:
push(8);
break;
case R.id.btn9:
push(9);
break;
case R.id.btnDot:
push(.);
break;
case R.id.btnEqual:// =
push(=);
break;
case R.id.btnPM:// 符號(hào),正負(fù)數(shù)
push(f);
break;
case R.id.btnDel:// <- delete
push(d);
break;
}
}
復(fù)制代碼 代碼說(shuō)明: a). R.id這些全是界面上的按鈕, 分別代表加減乘除、0-9等。 b). 基本原理:利用堆棧模型,一個(gè)操作數(shù) + 一個(gè)操作符 + 一個(gè)操作數(shù) 完成一次運(yùn)算,清空棧,把結(jié)果壓入棧底。 c). 最大支持小數(shù)點(diǎn)前15位和后6位,大家可以調(diào)整一下,只是注意不要溢出了。 d). UI和代碼就不提供下載了,需要的也可以簡(jiǎn)單的封裝一下成一個(gè)工具類。
堆棧模型也很好擴(kuò)展支持其他的運(yùn)算符,對(duì)于簡(jiǎn)單運(yùn)算實(shí)現(xiàn)起來(lái)很方便,簡(jiǎn)單測(cè)試了一下沒(méi)有問(wèn)題,有問(wèn)題歡迎指正 :)
|
上一篇: 顯示一個(gè)模態(tài)對(duì)話框,帶yes/no按鈕下一篇: Android程序查詢包含“*" "#”的號(hào)碼時(shí)出錯(cuò)的解決辦法
|