編輯: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程序設計的人都知道Android有三個基礎組件Activity,Service和BroadcastReceiver,他們都是依賴Int
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
很多程序在完全載入之前往往會先顯示一個載入界面,提示用戶等待,這樣對提高用戶體
仿水波紋流球進度條控制器,Android實現高端大氣的主流特效,供大家參考,具體內容如下 效果圖: CircleView 這裡主要是實現中心圓以及水波特效