1. 程式人生 > >Android-EditText兩種方法限制輸入兩位小數

Android-EditText兩種方法限制輸入兩位小數

為什麼有這個需求

說實話,這個需求簡直可以說無處不在了,因為,只要有輸入金額的需求,客戶端限制輸入位數幾乎是肯定的。

功能點分析

1.首位輸入.的時候,補全為0.

2.刪除“.”後面超過2位後的資料

3.如果起始位置為0,且第二位跟的不是”.”,則無法後續輸入

程式碼實現之 TextWatcher 方法


/**
 *
 *描述   :金額輸入字型監聽類,限制小數點後輸入位數
 *
 * 預設限制小數點2位
 * 預設第一位輸入小數點時,轉換為0.
 * 如果起始位置為0,且第二位跟的不是".",則無法後續輸入
 *
 *作者   :Created by DuanRui on 2017/9/28.
 */
public class MoneyTextWatcher implements TextWatcher { private EditText editText; private int digits = 2; public MoneyTextWatcher(EditText et) { editText = et; } public MoneyTextWatcher setDigits(int d) { digits = d; return this; } @Override public
void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //刪除“.”後面超過2位後的資料 if (s.toString().contains(".")) { if (s.length() - 1 - s.toString().indexOf("."
) > digits) { s = s.toString().subSequence(0, s.toString().indexOf(".") + digits+1); editText.setText(s); editText.setSelection(s.length()); //游標移到最後 } } //如果"."在起始位置,則起始位置自動補0 if (s.toString().trim().substring(0).equals(".")) { s = "0" + s; editText.setText(s); editText.setSelection(2); } //如果起始位置為0,且第二位跟的不是".",則無法後續輸入 if (s.toString().startsWith("0") && s.toString().trim().length() > 1) { if (!s.toString().substring(1, 2).equals(".")) { editText.setText(s.subSequence(0, 1)); editText.setSelection(1); return; } } } @Override public void afterTextChanged(Editable s) { } }

使用方法:


//預設兩位小數
mEditText.addTextChangedListener(new MoneyTextWatcher(mEditText1));

//手動設定其他位數,例如3
mEditText.addTextChangedListener(new MoneyTextWatcher(mEditText1).setDigits(3);

程式碼實現之 setFilter 方法


/**
 *
 *描述   :金額輸入過濾器,限制小數點後輸入位數
 *
 * 預設限制小數點2位
 * 預設第一位輸入小數點時,轉換為0.
 * 如果起始位置為0,且第二位跟的不是".",則無法後續輸入
 *
 *作者   :Created by DuanRui on 2017/9/28.
 */

public class MoneyValueFilter extends DigitsKeyListener {

    private static final String TAG = "MoneyValueFilter";
    public MoneyValueFilter() {
        super(false, true);
    }

    private int digits = 2;

    public MoneyValueFilter setDigits(int d) {
        digits = d;
        return this;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);


        // if changed, replace the source
        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int len = end - start;

        // if deleting, source is empty
        // and deleting can't break anything
        if (len == 0) {
            return source;
        }

        //以點開始的時候,自動在前面新增0
        if(source.toString().equals(".") && dstart == 0){
            return "0.";
        }
        //如果起始位置為0,且第二位跟的不是".",則無法後續輸入
        if(!source.toString().equals(".") && dest.toString().equals("0")){
            return "";
        }

        int dlen = dest.length();

        // Find the position of the decimal .
        for (int i = 0; i < dstart; i++) {
            if (dest.charAt(i) == '.') {
                // being here means, that a number has
                // been inserted after the dot
                // check if the amount of digits is right
                return (dlen-(i+1) + len > digits) ?
                    "" :
                    new SpannableStringBuilder(source, start, end);
            }
        }

        for (int i = start; i < end; ++i) {
            if (source.charAt(i) == '.') {
                // being here means, dot has been inserted
                // check if the amount of digits is right
                if ((dlen-dend) + (end-(i + 1)) > digits)
                    return "";
                else
                    break;  // return new SpannableStringBuilder(source, start, end);
            }
        }


        // if the dot is after the inserted part,
        // nothing can break
        return new SpannableStringBuilder(source, start, end);
    }
}

使用方法:


//預設兩位小數
mEditText.setFilters(new InputFilter[]{new MoneyValueFilter()});

//手動設定其他位數,例如3
mEditText.setFilters(new InputFilter[]{new MoneyValueFilter().setDigits(3)});

上述程式碼已上傳我的 github,專案地址為 DR_MoneyEditTextDemo,歡迎 Star,熱烈歡迎 Follow 。


歡迎關注博主的微信公眾號,快快加入哦,期待與你一起成長!