EditText 限制輸入整數和小數 的位元,edittext整數
如題,本文主要說的就是 如何限制 EditText 中 可輸入整數和小數 的位元 。
近期,由於公司業務需求中有價格輸入功能,給出的要求說是,必須整數能輸入幾位,小數能輸入幾位。。。好嘛,產品一句話,開發人員就得忙好久。平時工作過程中,一般用到的都是限制輸入內容的長度而已,像這種限制 數值輸入的整數位和小數位的需求還真不怎麼多見。當時,做到這個的時候,我也有種懵逼的感覺,感覺真是太麻煩了,,後來想了想,只要分析清楚了,還是挺容易的。現整理出來,希望能協助到有需要的人。
用法如下:
EditText etTest = (EditText) findViewById(R.id.et_test); etTest.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); etTest.addTextChangedListener(new DecimalInputTextWatcher(etTest,3,5));// 整數最多3位,小數最多5位
實現的原理就是 實現 implements TextWatcher,重寫其中的方法 :
public void afterTextChanged(Editable editable){}
DecimalInputTextWatcher 源碼:
import android.text.Editable;import android.text.InputFilter;import android.text.TextWatcher;import android.widget.EditText;/** * EditText 限制輸入整數和小數 的位元 * 預設 整數位無限制,小數位 最多2位 * <p> * Created by dingzuoqiang on 2017/11/24. * 530858106@qq.com */public class DecimalInputTextWatcher implements TextWatcher { /** * 需要設定該 DecimalInputTextWatcher 的 EditText */ private EditText editText = null; /** * 預設 小數的位元 2 位 */ private static final int DEFAULT_DECIMAL_DIGITS = 2; private int decimalDigits;// 小數的位元 private int integerDigits;// 整數的位元 public DecimalInputTextWatcher(EditText editText) { this.editText = editText; this.decimalDigits = DEFAULT_DECIMAL_DIGITS; } /** * @param editText editText * @param decimalDigits 小數的位元 */ public DecimalInputTextWatcher(EditText editText, int decimalDigits) { this.editText = editText; if (decimalDigits <= 0) throw new RuntimeException("decimalDigits must > 0"); this.decimalDigits = decimalDigits; } /** * @param editText editText * @param integerDigits 整數的位元 * @param decimalDigits 小數的位元 */ public DecimalInputTextWatcher(EditText editText, int integerDigits, int decimalDigits) { this.editText = editText; if (integerDigits <= 0) throw new RuntimeException("integerDigits must > 0"); if (decimalDigits <= 0) throw new RuntimeException("decimalDigits must > 0"); this.integerDigits = integerDigits; this.decimalDigits = decimalDigits; } @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { String s = editable.toString(); editText.removeTextChangedListener(this); if (s.contains(".")) { if (integerDigits > 0) { editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(integerDigits + decimalDigits + 1)}); } if (s.length() - 1 - s.indexOf(".") > decimalDigits) { s = s.substring(0, s.indexOf(".") + decimalDigits + 1); editable.replace(0, editable.length(), s.trim()); } } else { if (integerDigits > 0) { editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(integerDigits + 1)}); if (s.length() > integerDigits) { s = s.substring(0, integerDigits); editable.replace(0, editable.length(), s.trim()); } } } if (s.trim().equals(".")) { s = "0" + s; editable.replace(0, editable.length(), s.trim()); } if (s.startsWith("0") && s.trim().length() > 1) { if (!s.substring(1, 2).equals(".")) { editable.replace(0, editable.length(), "0"); } } editText.addTextChangedListener(this); }}
源碼下載