編輯:關於android開發
- private TextView mNumberText;
- /** 格式化數據 */
- private static final DecimalFormat mFormat = new DecimalFormat(
- "###############.######");
- /** 堆棧 */
- private Stack<String> mMathStack = new Stack<String>();
- /** 操作數 入棧 */
- private void push(char obj) {
- final int size = mMathStack.size();
- // 清除
- if ('c' == obj) {
- mMathStack.clear();
- mNumberText.setText("0");
- return;
- }
- // 操作符號
- if ('+' == obj || '-' == obj || '*' == obj || '/' == obj || '=' == obj) {
- switch (size) {
- case 0:
- break;
- case 2:
- if ('=' != obj)
- mMathStack.set(1, obj + "");// 同時輸入兩個操作符,後面的操作符替換前面的
- 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;
- }
- /** 解析文本數據 */
- private double parseDouble(String str) {
- try {
- return Double.parseDouble(str);
- } catch (NumberFormatException e) {
- return 0.0D;
- }
- }
- /** 點擊事件 */
- @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:// 符號,正負數
- push('f');
- break;
- case R.id.btnDel:// <- delete
- push('d');
- break;
- }
- }
代碼說明:
a). R.id這些全是界面上的按鈕, 分別代表加減乘除、0-9等。
b). 基本原理:利用堆棧模型,一個操作數 + 一個操作符 + 一個操作數 完成一次運算,清空棧,把結果壓入棧底。
c). 最大支持小數點前15位和後6位,大家可以調整一下,只是注意不要溢出了。
d). UI和代碼就不提供下載了,需要的也可以簡單的封裝一下成一個工具類。
結束
堆棧模型也很好擴展支持其他的運算符,對於簡單運算實現起來很方便,簡單測試了一下沒有問題,有問題歡迎指正 :)
Android studio 插件安裝 plugin Android studio 插件安裝 plugin android studio 上有很多第三方
Android Animation學習 實現 IOS 濾鏡退出動畫,androidiosIOS的用戶體驗做的很好,其中一點很重要的地方就是動畫效果。 最近在學習Andro
Android 視頻播放器進度的處理,android進度在前面的項目中添加SeekBar <SeekBar android:id=@+id/sb
Android 設計隨便說說之簡單實踐(合理組合),android隨便說說上一篇(Android 設計隨便說說之簡單實踐(模塊劃分))例舉了應用商店設計來說明怎麼做模塊劃