1. 程式人生 > >Android小專案:計算器

Android小專案:計算器

專案原始碼在文章最後。

這兩天寫了一個Android的計算器,現在整理一下思路與程式碼。

首先是功能需求分析:

1、數字我規定最長為九位,如果有小數點則加上小數點最長為十位

2、第二個引數輸入時不允許為負數,但是先得出的結果為負數,可以再進行運算(比如:1-2=-1,結果顯示的是-1,可以再運算,-1+2=1)

3、得出的結果如果大於等於10位,則把資料進行科學計數

4、科學計數的資料不能再進行運算,再按按鈕會直接顯示0或者當前按下的數字

5、進行連續運算時,會先計算先一個運算的結果,在把結果作為第一個引數進行下次運算(比如:1+2+3,當按下第二個加號的時候,會顯示3+,先把前一個運算的結果算出來再進行下一個運算)

6、當除數為0時,顯示 error

7、預設情況下,顯示 0

8、是否進行運算過,判斷是否按下過等於號,如果按下,顯示了結果,再按數字則直接顯示當前數字而不是在結果後新增這個數字

接下來是正式開始編寫程式碼:

1、介面佈局 (TableLayout 實現按鈕排版 ,EditText 顯示錶達式或值)

2、初始化所有控制元件,以及為需要點選事件的控制元件繫結監聽器

3、編寫監聽器事件邏輯程式碼

①當按下的是數字,先判斷是否計算過

----是(按下過等號):把顯示的文字改為當前按下的數字,計算過的標誌設為false

----否(沒按過等號):進行下一步判斷,計算過的標誌設為false

--------判斷當前文字是否有科學計數

--------是(有科學計數的標誌 e ):文字置為 0

--------判斷文字是否只有一個 0

--------是(當前文字為 0):文字置為空

--------判斷是否有運算子

--------是(包含運算子):取出運算子後的第二個引數,進行下一步判斷

------------判斷最後一個是否是運算子

------------是(文字最後一個是運算子號):則直接新增按下的數字

------------否(文字最後一個不是運算子號):進行下一步判斷

----------------判斷第二個引數的長度,包括小數點則可以為10位,不包括小數點只能為9位

--------否(不包含運算子):判斷第一個引數(即整個文字)的長度,包括小數點則可以為10位,不包括小數點只能為9位

②當按下的是小數點,先判斷是否計算過

----是(按下過等號):把文字改為 0. (數字 0 的後面有一個小數點),把計算過的標誌位設為 false

----否(沒按過等號):進行下一步判斷,,把計算過的標誌位設為 false

--------判斷是否有運算子

--------是(包含運算子):取出第二個引數,判斷長度是否超過,是:無操作,否:判斷引數中是否已經有小數點,有:無操作,否,新增小數點

--------否(不包含運算子):判斷第一個引數(即整個文字)的長度是否超過,是:無操作,否:判斷引數中是否已經有小數點,有:無操作,否,新增小數點

③當按下的是特殊鍵(歸零、回退、百分比)

----歸零:直接把文字改為 0

----回退:判斷文字是否是 error,是:文字改為 0,否:判斷文字的長度,當文字的長度大於0時且不等於1時,文字刪掉最後一個字元,文字長度為1時,文字改為 0

----百分比:判斷文字是否是 error,是:無操作,否:判斷是否是表示式,是:無操作,否:數字除百

④當按下的是運算子,判斷當前的文字是否是科學計數

----是(文字是科學計數,包含 e):文字置 0

----否(文字不是科學計數,不包含 e):進行下一步判斷,且第二個引數不為空

--------判斷文字是否是表示式

--------是(是表示式,有兩個引數):先得出結果,如果結果不是 error,新增上相應的運算子,如果結果是 error,無操作

--------否(不是表示式,可能是數字,也可能是數字後面帶一個運算子):如果計算過的標誌位為 true,改為 false,如果最後一個字元為其他運算子,則改為當前按下的運算子,如果最後一個不是當前按下的運算子,則新增改運算子

⑤當按下的是等號,判斷當前文字是否是表示式

----是:判斷包含的是哪種運算子,取出兩個引數,如果第二個引數為空,則無操作,如果第二個引數不為空,則進行相應的計算,再把運算結果進行格式化,然後用正則表示式去掉多餘的 0  。如果結果的長度大於10位,則把數字轉換成科學計數

佈局程式碼如下(activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <EditText
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:textSize="30sp"
        android:padding="20dp"
        android:layout_gravity="end"
        android:editable="false"
        android:textAlignment="textEnd"
        android:singleLine="true"
        android:text="0"
        />

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="AC"
                android:id="@+id/ac_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="Del"
                android:id="@+id/delete_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="%"
                android:id="@+id/percent_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="÷"
                android:id="@+id/divide_btn" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="7"
                android:id="@+id/num_seven" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="8"
                android:id="@+id/num_eight" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="9"
                android:id="@+id/num_nine" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="×"
                android:id="@+id/multiply_btn" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="4"
                android:id="@+id/num_four" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="5"
                android:id="@+id/num_five" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="6"
                android:id="@+id/num_six" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="-"
                android:id="@+id/subtract_btn" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="1"
                android:id="@+id/num_one" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="2"
                android:id="@+id/num_two" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="3"
                android:id="@+id/num_three" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="+"
                android:id="@+id/plus_btn" />
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="0"
                android:id="@+id/num_zero" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="."
                android:id="@+id/dot_btn" />

            <Button
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="70dp"
                android:textSize="22sp"
                android:text="="
                android:id="@+id/equal_btn" />
        </TableRow>

    </TableLayout>
</LinearLayout>

介面效果如下:


邏輯部分程式碼如下(MainActivity.java):

package com.ikok.calculator;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    /**
     * 數字
     */
    private Button num0;
    private Button num1;
    private Button num2;
    private Button num3;
    private Button num4;
    private Button num5;
    private Button num6;
    private Button num7;
    private Button num8;
    private Button num9;
    /**
     * 運算子
     */
    private Button plus_btn;
    private Button subtract_btn;
    private Button multiply_btn;
    private Button divide_btn;
    private Button equal_btn;
    /**
     * 其他
     */
    private Button dot_btn;
    private Button percent_btn;
    private Button delete_btn;
    private Button ac_btn;
    /**
     * 結果
     */
    private EditText mResultText;
    /**
     * 已經輸入的字元
     */
    private String existedText = "";
    /**
     * 是否計算過
     */
    private boolean isCounted = false;
    /**
     * 以負號開頭,且運算子不是是減號
     * 例如:-21×2
     */
    private boolean startWithOperator = false;
    /**
     * 以負號開頭,且運算子是減號
     * 例如:-21-2
     */
    private boolean startWithSubtract = false;
    /**
     * 不以負號開頭,且包含運算子
     * 例如:21-2
     */
    private boolean noStartWithOperator = false;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initEvent();

    }

    /**
     * 初始化控制元件
     */
    private void initView() {
        /**
         * 數字
         */
        num0 = (Button) findViewById(R.id.num_zero);
        num1 = (Button) findViewById(R.id.num_one);
        num2 = (Button) findViewById(R.id.num_two);
        num3 = (Button) findViewById(R.id.num_three);
        num4 = (Button) findViewById(R.id.num_four);
        num5 = (Button) findViewById(R.id.num_five);
        num6 = (Button) findViewById(R.id.num_six);
        num7 = (Button) findViewById(R.id.num_seven);
        num8 = (Button) findViewById(R.id.num_eight);
        num9 = (Button) findViewById(R.id.num_nine);
        /**
         * 運算子
         */
        plus_btn = (Button) findViewById(R.id.plus_btn);
        subtract_btn = (Button) findViewById(R.id.subtract_btn);
        multiply_btn = (Button) findViewById(R.id.multiply_btn);
        divide_btn = (Button) findViewById(R.id.divide_btn);
        equal_btn = (Button) findViewById(R.id.equal_btn);
        /**
         * 其他
         */
        dot_btn = (Button) findViewById(R.id.dot_btn);
        percent_btn = (Button) findViewById(R.id.percent_btn);
        delete_btn = (Button) findViewById(R.id.delete_btn);
        ac_btn = (Button) findViewById(R.id.ac_btn);
        /**
         * 結果
         */
        mResultText = (EditText) findViewById(R.id.result_text);
        /**
         * 已經輸入的字元
         */
        existedText = mResultText.getText().toString();

    }

    /**
     * 初始化事件
     */
    private void initEvent() {
        num0.setOnClickListener(this);
        num1.setOnClickListener(this);
        num2.setOnClickListener(this);
        num3.setOnClickListener(this);
        num4.setOnClickListener(this);
        num5.setOnClickListener(this);
        num6.setOnClickListener(this);
        num7.setOnClickListener(this);
        num8.setOnClickListener(this);
        num9.setOnClickListener(this);

        plus_btn.setOnClickListener(this);
        subtract_btn.setOnClickListener(this);
        multiply_btn.setOnClickListener(this);
        divide_btn.setOnClickListener(this);
        equal_btn.setOnClickListener(this);

        dot_btn.setOnClickListener(this);
        percent_btn.setOnClickListener(this);
        delete_btn.setOnClickListener(this);
        ac_btn.setOnClickListener(this);
    }

    /**
     * 點選事件
     * @param v  點選的控制元件
     */
    @Override
    public void onClick(View v) {

        switch (v.getId()){
            /**
             * 數字
             */
            case R.id.num_zero:
                existedText = isOverRange(existedText,"0");
                break;
            case R.id.num_one:
                existedText = isOverRange(existedText,"1");
                break;
            case R.id.num_two:
                existedText = isOverRange(existedText,"2");
                break;
            case R.id.num_three:
                existedText = isOverRange(existedText,"3");
                break;
            case R.id.num_four:
                existedText = isOverRange(existedText,"4");
                break;
            case R.id.num_five:
                existedText = isOverRange(existedText,"5");
                break;
            case R.id.num_six:
                existedText = isOverRange(existedText,"6");
                break;
            case R.id.num_seven:
                existedText = isOverRange(existedText,"7");
                break;
            case R.id.num_eight:
                existedText = isOverRange(existedText,"8");
                break;
            case R.id.num_nine:
                existedText = isOverRange(existedText,"9");
                break;
            /**
             * 運算子
             */
            case R.id.plus_btn:
                /**
                 * 判斷已有的字元是否是科學計數
                 * 是 置零
                 * 否 進行下一步
                 *
                 * 判斷表示式是否可以進行計算
                 * 是 先計算再新增字元
                 * 否 新增字元
                 *
                 * 判斷計算後的字元是否是 error
                 * 是 置零
                 * 否 新增運算子
                 */
                if (!existedText.contains("e")) {

                    if (judgeExpression()) {
                        existedText = getResult();
                        if (existedText.equals("error")){

                        } else {
                            existedText += "+";
                        }
                    } else {

                        if (isCounted) {
                            isCounted = false;
                        }

                        if ((existedText.substring(existedText.length() - 1)).equals("-")) {
                            existedText = existedText.replace("-", "+");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("×")) {
                            existedText = existedText.replace("×", "+");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {
                            existedText = existedText.replace("÷", "+");
                        } else if (!(existedText.substring(existedText.length() - 1)).equals("+")) {
                            existedText += "+";
                        }
                    }
                } else {
                    existedText = "0";
                }

                break;
            case R.id.subtract_btn:

                if (!existedText.contains("e")) {
                    if (judgeExpression()) {
                        existedText = getResult();
                        if (existedText.equals("error")){

                        } else {
                            existedText += "-";
                        }
                    } else {

                        if (isCounted) {
                            isCounted = false;
                        }

                        if ((existedText.substring(existedText.length() - 1)).equals("+")) {
//                    Log.d("Anonymous", "onClick: " + "進入減法方法");
                            existedText = existedText.replace("+", "-");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("×")) {
                            existedText = existedText.replace("×", "-");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {
                            existedText = existedText.replace("÷", "-");
                        } else if (!(existedText.substring(existedText.length() - 1)).equals("-")) {
                            existedText += "-";
                        }
                    }
                } else {
                    existedText = "0";
                }
                break;
            case R.id.multiply_btn:

                if (!existedText.contains("e")) {
                    if (judgeExpression()) {
                        existedText = getResult();
                        if (existedText.equals("error")){

                        } else {
                            existedText += "×";
                        }

                    } else {

                        if (isCounted) {
                            isCounted = false;
                        }

                        if ((existedText.substring(existedText.length() - 1)).equals("+")) {
                            existedText = existedText.replace("+", "×");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("-")) {
                            existedText = existedText.replace("-", "×");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("÷")) {
                            existedText = existedText.replace("÷", "×");
                        } else if (!(existedText.substring(existedText.length() - 1)).equals("×")) {
                            existedText += "×";
                        }
                    }
                } else {
                    existedText = "0";
                }
                break;
            case R.id.divide_btn:

                if (!existedText.contains("e")) {
                    if (judgeExpression()) {
                        existedText = getResult();
                        if (existedText.equals("error")){

                        } else {
                            existedText += "÷";
                        }

                    } else {

                        if (isCounted) {
                            isCounted = false;
                        }

                        if ((existedText.substring(existedText.length() - 1)).equals("+")) {
                            existedText = existedText.replace("+", "÷");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("-")) {
                            existedText = existedText.replace("-", "÷");
                        } else if ((existedText.substring(existedText.length() - 1)).equals("×")) {
                            existedText = existedText.replace("×", "÷");
                        } else if (!(existedText.substring(existedText.length() - 1)).equals("÷")) {
                            existedText += "÷";
                        }
                    }
                } else {
                    existedText = "0";
                }
                break;
            case R.id.equal_btn:
                existedText = getResult();
                isCounted = true;
                break;
            /**
             * 其他
             */
            case R.id.dot_btn:
                /**
                 * 判斷是否運算過
                 * 否
                 *   判斷是否有運算子,有 判斷運算子之後的數字,無 判斷整個數字
                 *   判斷數字是否過長,是則不能新增小數點,否則可以新增
                 *   判斷已經存在的數字裡是否有小數點
                 * 是
                 *   字串置為 0.
                 */
                if (!isCounted){

                    if (existedText.contains("+") || existedText.contains("-") ||
                            existedText.contains("×") || existedText.contains("÷") ){

                        String param1 = null;
                        String param2 = null;

                        if (existedText.contains("+")) {
                            param1 = existedText.substring(0, existedText.indexOf("+"));
                            param2 = existedText.substring(existedText.indexOf("+") + 1);
                        } else if (existedText.contains("-")) {
                            param1 = existedText.substring(0, existedText.indexOf("-"));
                            param2 = existedText.substring(existedText.indexOf("-") + 1);
                        } else if (existedText.contains("×")) {
                            param1 = existedText.substring(0, existedText.indexOf("×"));
                            param2 = existedText.substring(existedText.indexOf("×") + 1);
                        } else if (existedText.contains("÷")) {
                            param1 = existedText.substring(0, existedText.indexOf("÷"));
                            param2 = existedText.substring(existedText.indexOf("÷") + 1);
                        }
                        Log.d("Anonymous param1",param1);
                        Log.d("Anonymous param2",param2);

                        boolean isContainedDot = param2.contains(".");
                        if (param2.length() >= 9){

                        } else if (!isContainedDot){
                            if (param2.equals("")){
                                existedText += "0.";
                            } else {
                                existedText += ".";
                            }
                        } else {
                            return;
                        }
                    } else {
                        boolean isContainedDot = existedText.contains(".");
                        if (existedText.length() >= 9){

                        } else if (!isContainedDot){
                            existedText += ".";
                        } else {
                            return;
                        }
                    }
                    isCounted = false;

                } else {
                    existedText = "0.";
                    isCounted = false;
                }


                break;
            case R.id.percent_btn:
                /**
                 * 判斷數字是否有運算子
                 * 是 不做任何操作
                 * 否 進行下一步
                 *
                 * 判斷數字是否是 0
                 * 是 不做任何操作
                 * 否 進行除百
                 *
                 * 將字串轉換成double型別,進行運算後,再轉換成String型
                 */
                if (existedText.equals("error")){

                } else {

                    getCondition();

                    if (startWithOperator || startWithSubtract || noStartWithOperator) {

                    } else {
                        if (existedText.equals("0")) {
                            return;
                        } else {
                            double temp = Double.parseDouble(existedText);
                            temp = temp / 100;
                            existedText = String.valueOf(temp);
                        }
                    }
                }
                break;
            case R.id.delete_btn:
                /**
                 * 字串長度大於 0 時才擷取字串
                 * 如果長度為 1,則直接把字串設定為 0
                 */
                if (existedText.equals("error")){
                    existedText = "0";
                } else if (existedText.length() > 0){
                    if (existedText.length() == 1) {
                        existedText = "0";
                    } else {
                        existedText = existedText.substring(0,existedText.length()-1);
                    }
                }
                break;
            case R.id.ac_btn:
                existedText = "0";
                break;
        }
        /**
         * 設定顯示
         */
        mResultText.setText(existedText);
    }



    /**
     * 進行運算,得到結果
     * @return  返回結果
     */
    private String getResult() {

        /**
         * 結果
         */
        String tempResult = null;
        /**
         * 兩個String型別的引數
         */
        String param1 = null;
        String param2 = null;
        /**
         * 轉換後的兩個double型別的引數
         */
        double arg1 = 0;
        double arg2 = 0;
        double result = 0;

        getCondition();

        /**
         * 如果有運算子,則進行運算
         * 沒有運算子,則把已經存在的資料再傳出去
         */
        if ( startWithOperator || noStartWithOperator || startWithSubtract) {

            if (existedText.contains("+")) {
                /**
                 * 先獲取兩個引數
                 */
                param1 = existedText.substring(0, existedText.indexOf("+"));
                param2 = existedText.substring(existedText.indexOf("+") + 1);
                /**
                 * 如果第二個引數為空,則還是顯示當前字元
                 */
                if (param2.equals("")){
                    tempResult = existedText;
                } else {
                    /**
                     * 轉換String為Double
                     * 計算後再轉換成String型別
                     * 進行正則表示式處理
                     */
                    arg1 = Double.parseDouble(param1);
                    arg2 = Double.parseDouble(param2);
                    result = arg1 + arg2;
                    tempResult = String.format("%f", result);
                    tempResult = subZeroAndDot(tempResult);
                }


            } else if (existedText.contains("×")) {

                param1 = existedText.substring(0, existedText.indexOf("×"));
                param2 = existedText.substring(existedText.indexOf("×") + 1);

                if (param2.equals("")){
                    tempResult = existedText;
                } else {
                    arg1 = Double.parseDouble(param1);
                    arg2 = Double.parseDouble(param2);
                    result = arg1 * arg2;
                    tempResult = String.format("%f", result);
                    tempResult = subZeroAndDot(tempResult);
                }

            } else if (existedText.contains("÷")) {

                param1 = existedText.substring(0, existedText.indexOf("÷"));
                param2 = existedText.substring(existedText.indexOf("÷") + 1);

                if (param2.equals("0")){
                    tempResult = "error";
                } else if (param2.equals("")){
                    tempResult = existedText;
                } else {
                    arg1 = Double.parseDouble(param1);
                    arg2 = Double.parseDouble(param2);
                    result = arg1 / arg2;
                    tempResult = String.format("%f", result);
                    tempResult = subZeroAndDot(tempResult);
                }

            } else if (existedText.contains("-")) {

                /**
                 * 這裡是以最後一個 - 號為分隔去取出兩個引數
                 * 進到這個方法,必須滿足有運算公式
                 * 而又避免了第一個引數是負數的情況
                 */
                param1 = existedText.substring(0, existedText.lastIndexOf("-"));
                param2 = existedText.substring(existedText.lastIndexOf("-") + 1);

                if (param2.equals("")){
                    tempResult = existedText;
                } else {
                    arg1 = Double.parseDouble(param1);
                    arg2 = Double.parseDouble(param2);
                    result = arg1 - arg2;
                    tempResult = String.format("%f", result);
                    tempResult = subZeroAndDot(tempResult);
                }

            }
            /**
             * 如果資料長度大於等於10位,進行科學計數
             *
             * 如果有小數點,再判斷小數點前是否有十個數字,有則進行科學計數
             */
            if (tempResult.length() >= 10) {
                tempResult = String.format("%e", Double.parseDouble(tempResult));
            } else if (tempResult.contains(".")) {
                if (tempResult.substring(0, tempResult.indexOf(".")).length() >= 10) {
                    tempResult = String.format("%e", Double.parseDouble(tempResult));
                }
            }
        } else {
            tempResult = existedText;
        }

        return tempResult;
    }


    /**
     * 先判斷是否按過等於號
     * 是 按數字則顯示當前數字
     * 否 在已有的表示式後新增字元
     *
     * 判斷數字是否就是一個 0
     * 是 把字串設定為空字串。
     *   1、開啟介面沒有運算過的時候,AC鍵歸零或刪除完歸零的時候,會顯示一個 0
     *   2、當數字是 0 的時候,設定成空字串,再按 0 ,數字會還是 0,不然可以按出 000 這種數字
     * 否 新增按下的鍵的字元
     *
     * 判斷數字是否包含小數點
     * 是 數字不能超過十位
     * 否 數字不能超過九位
     *
     * 進行上面的判斷後,再判斷數字是否超過長度限制
     * 超過不做任何操作
     * 沒超過可以再添數字
     */
    private String isOverRange(String existedText, String s) {
        /**
         * 判斷是否計算過
         */
        if (!isCounted){
            /**
             * 判斷是否是科學計數
             * 是 文字置零
             */
            if (existedText.contains("e")){
                existedText = "0";
            }
            /**
             * 判斷是否只有一個 0
             * 是 文字清空
             */
            if (existedText.equals("0")){
                existedText = "";
            }
            /**
             * 判斷是否有運算子
             * 是 判斷第二個數字
             * 否 判斷整個字串
             */
            if (existedText.contains("+") || existedText.contains("-") ||
                    existedText.contains("×") || existedText.contains("÷")){
                /**
                 * 包括運算子時 兩個數字 判斷第二個數字
                 * 兩個引數
                 */
                String param2 = null;
                if (existedText.contains("+")){
                    param2 = existedText.substring(existedText.indexOf("+")+1);
                } else if (existedText.contains("-")){
                    param2 = existedText.substring(existedText.indexOf("-")+1);
                } else if (existedText.contains("×")){
                    param2 = existedText.substring(existedText.indexOf("×")+1);
                } else if (existedText.contains("÷")){
                    param2 = existedText.substring(existedText.indexOf("÷")+1);
                }

//            Log.d("Anonymous param1",param1);
//            Log.d("Anonymous param2",param2);
                if (existedText.substring(existedText.length()-1).equals("+") ||
                        existedText.substring(existedText.length()-1).equals("-") ||
                        existedText.substring(existedText.length()-1).equals("×") ||
                        existedText.substring(existedText.length()-1).equals("÷")){
                    existedText += s;
                } else {
                    if (param2.contains(".")){
                        if (param2.length() >= 10){

                        } else {
                            existedText += s;
                        }
                    } else {
                        if (param2.length() >= 9){

                        } else {
                            existedText += s;
                        }
                    }
                }
            } else {
                /**
                 * 不包括運算子時 一個數字
                 */
                if (existedText.contains(".")){
                    if (existedText.length() >= 10){

                    } else {
                        existedText += s;
                    }
                } else {
                    if (existedText.length() >= 9){

                    } else {
                        existedText += s;
                    }
                }
            }

            isCounted = false;

        } else {

            existedText = s;
            isCounted = false;

        }


        return existedText;
    }


    /**
     * 使用java正則表示式去掉多餘的.與0
     * @param s 傳入的字串
     * @return 修改之後的字串
     */
    public static String subZeroAndDot(String s){
        if(s.indexOf(".") > 0){
            s = s.replaceAll("0+?$", "");//去掉多餘的0
            s = s.replaceAll("[.]$", "");//如最後一位是.則去掉
        }
        return s;
    }

    /**
     * 判斷表示式
     *
     * 為了按等號是否進行運算
     * 以及出現兩個運算子(第一個引數如果為負數的符號不計)先進行運算再新增運算子
     */
    private boolean judgeExpression() {

        getCondition();

        String tempParam2 = null;

        if ( startWithOperator || noStartWithOperator || startWithSubtract) {

            if (existedText.contains("+")) {
                /**
                 * 先獲取第二個引數
                 */
                tempParam2 = existedText.substring(existedText.indexOf("+") + 1);
                /**
                 * 如果第二個引數為空,表示式不成立
                 */
                if (tempParam2.equals("")) {
                    return false;
                } else {
                    return true;
                }
            } else if (existedText.contains("×")) {

                tempParam2 = existedText.substring(existedText.indexOf("×") + 1);

                if (tempParam2.equals("")) {
                    return false;
                } else {
                    return true;
                }

            } else if (existedText.contains("÷")) {

                tempParam2 = existedText.substring(existedText.indexOf("÷") + 1);

                if (tempParam2.equals("")) {
                    return false;
                } else {
                    return true;
                }

            } else if (existedText.contains("-")) {

                /**
                 * 這裡是以最後一個 - 號為分隔去取出兩個引數
                 * 進到這個方法,必須滿足有運算公式
                 * 而又避免了第一個引數是負數的情況
                 */
                tempParam2 = existedText.substring(existedText.lastIndexOf("-") + 1);

                if (tempParam2.equals("")) {
                    return false;
                } else {
                    return true;
                }

            }
        }
        return false;
    }

    /**
     * 取得判斷條件
     */
    private void getCondition() {
        /**
         * 以負號開頭,且運算子不是是減號
         * 例如:-21×2
         */
        startWithOperator = existedText.startsWith("-") && ( existedText.contains("+") ||
                existedText.contains("×") || existedText.contains("÷") );
        /**
         * 以負號開頭,且運算子是減號
         * 例如:-21-2
         */
        startWithSubtract = existedText.startsWith("-") && ( existedText.lastIndexOf("-") != 0 );
        /**
         * 不以負號開頭,且包含運算子
         * 例如:21-2
         */
        noStartWithOperator = !existedText.startsWith("-") && ( existedText.contains("+") ||
                existedText.contains("-") || existedText.contains("×") || existedText.contains("÷"));
    }

}


執行效果如下:


Calculator 即是。