Android EditText輸入金額處理

簡述

在Android 開發(fā)中,肯定有小伙伴們有遇到要處理輸入金額的問題。希望這邊的方法能給需要的人提供下靈感。
老規(guī)矩先上圖:


錄屏.gif

布局設(shè)置

本案例寫了一點(diǎn)點(diǎn)UI,這邊就截圖看個(gè)大概,相信大伙都能看得懂


activity_main.png

其中重點(diǎn)看看EditText 的設(shè)置

        <EditText
            android:id="@+id/edt_money"
            android:text=""
            android:background="@null"
            android:hint="請(qǐng)輸入充值金額"
            android:maxLines="1"
            android:maxLength="15"
            android:inputType="numberDecimal"
            android:textSize="16sp"
            android:imeOptions="actionDone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp" />

設(shè)置了輸入類型inputType 的屬性為numberDecimal,只允許其輸入帶小數(shù)點(diǎn)的浮點(diǎn)格式。而imeOptions設(shè)置為actionDone屬性,則是為了設(shè)置輸入法軟盤右下角的按鈕為完成按鈕,當(dāng)點(diǎn)擊的時(shí)候,會(huì)關(guān)閉軟盤。
底部的輸入金額按鈕,則只是簡單設(shè)置了個(gè)選擇器,當(dāng)能點(diǎn)擊時(shí)為藍(lán)色,不可點(diǎn)擊時(shí)設(shè)置為灰色,在此就不貼出截圖了。
現(xiàn)在來看看主界面在初始化與綁定控件后,輸入框的代碼邏輯,我們通過EditText的addTextChangedListener來監(jiān)聽用戶的輸入狀態(tài),在用戶輸入完畢后afterTextChanged 方法中判斷輸入內(nèi)容是否合法,合法則允許點(diǎn)擊充值金額按鈕,否則置灰不可點(diǎn)擊。

主界面代碼(文末貼出 MainActivity 類完整代碼)

setEditChangedListener函數(shù)監(jiān)聽代碼如下()

           private void setEditChangedListener() {
            edt_money.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    String temp = s.toString();
                    int posDot = temp.indexOf(".");
                    if (posDot > 0) if (temp.length() - posDot - 1 > 2) {
                        s.delete(posDot + 3, posDot + 4);
                    }
                    tv_pay.setEnabled(ifCanChargeMoney());
                }
            });
    }

其中 posDot 是用來判斷 符號(hào)" . " 在字符串中第一次出現(xiàn)的索引,有則返回下標(biāo)位置,沒有則返回 -1 ,若是出現(xiàn),則再繼續(xù)判斷輸入的數(shù)值長度的小數(shù)點(diǎn)位數(shù)是否大于2位,若是大于2為,則刪除掉后面的小數(shù)位數(shù)值,只留兩位小數(shù)。

ifCanChargeMoney() 則是用于判斷最后輸入數(shù)值是否符合格式,若符合則輸入金額按鈕可點(diǎn)擊,代碼如下:

 private boolean ifCanChargeMoney() {
        //輸入為空
        if (TextUtils.isEmpty(edt_money.getText().toString())) return false;

        //獲取輸入余額
        balance=edt_money.getText().toString();

        //判斷格式是否符合金額
        if (!balance.matches(Money)) return false;
        
        //判斷金額不能小于等于 0
        if(Double.parseDouble(balance)<=0) return false;


        return true;
    }

其中Money 是金額的正則,范圍 0.00~9999999999.99

 String Money="(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";

自此,簡單實(shí)現(xiàn)了輸入金額判斷與處理,現(xiàn)在貼上MainActivity 類的完整代碼:

public class MainActivity extends AppCompatActivity {

    private EditText edt_money;
    private TextView tv_pay;
    private String balance;
    //金額正則   0.00~9999999999.99
    String Money="(^[1-9](\\d+)?(\\.\\d{1,2})?$)|(^0$)|(^\\d\\.\\d{1,2}$)";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setEditChangedListener();
        onClickEvent();

    }

    private void onClickEvent() {
        tv_pay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"輸入金額:"+balance,Toast.LENGTH_SHORT).show();
            }
        });


    }



    private boolean ifCanChargeMoney() {
        //輸入為空
        if (TextUtils.isEmpty(edt_money.getText().toString())) return false;

        //獲取輸入余額
        balance=edt_money.getText().toString();

        //判斷格式是否符合金額
        if (!balance.matches(Money)) return false;

        //判斷金額不能小于等于 0
        if(Double.parseDouble(balance)<=0) return false;


        return true;
    }

           private void setEditChangedListener() {
            edt_money.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    String temp = s.toString();
                    int posDot = temp.indexOf(".");
                    if (posDot > 0) if (temp.length() - posDot - 1 > 2) {
                        s.delete(posDot + 3, posDot + 4);
                    }
                    tv_pay.setEnabled(ifCanChargeMoney());
                }
            });
    }

    private void initView() {
        edt_money=findViewById(R.id.edt_money);
        tv_pay=findViewById(R.id.tv_pay);


    }
}

大致方法就這樣,希望能給小伙伴們提供到一點(diǎn)幫助
參考閱讀過的博客:https://blog.csdn.net/zuo_er_lyf/article/details/79715182

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容