本篇文章轉載自馮豐楓《Android EditText 小數(shù)輸入優(yōu)化》。大神使用正則表達式加TextWatcher對EditText小數(shù)輸入進行限制聪富,感覺比使用filter要方便很多凌简,代碼更加簡潔见剩,可讀性更高筋现。
先看一下作者的演示gif:
小數(shù)輸入演示
在需要做限制的EditText上add下面的TextWatcher就好:
public class DecimalInputTextWatcher implements TextWatcher {
private Pattern mPattern;
/**
* 不限制整數(shù)位數(shù)和小數(shù)位數(shù)
*/
public DecimalInputTextWatcher() {
}
/**
* 限制整數(shù)位數(shù)或著限制小數(shù)位數(shù)
*
* @param type 限制類型
* @param number 限制位數(shù)
*/
public DecimalInputTextWatcher(Type type, int number) {
if (type == Type.decimal) {
mPattern = Pattern.compile("^[0-9]+(\\.[0-9]{0," + number + "})?$");
} else if (type == Type.integer) {
mPattern = Pattern.compile("^[0-9]{0," + number + "}+(\\.[0-9]{0,})?$");
}
}
/**
* 既限制整數(shù)位數(shù)又限制小數(shù)位數(shù)
*
* @param integers 整數(shù)位數(shù)
* @param decimals 小數(shù)位數(shù)
*/
public DecimalInputTextWatcher(int integers, int decimals) {
mPattern = Pattern.compile("^[0-9]{0," + integers + "}+(\\.[0-9]{0," + decimals + "})?$");
}
@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 editable) {
String text = editable.toString();
if (TextUtils.isEmpty(text)) return;
// 刪除首位無效的“0”
if ((editable.length() > 1) && (editable.charAt(0) == '0') && editable.charAt(1) != '.') {
editable.delete(0, 1);
return;
}
// 首位是“.”自動補“0”
if (text.equals(".")) {
editable.insert(0, "0");
return;
}
if (mPattern != null && !mPattern.matcher(text).matches() && editable.length() > 0) {
editable.delete(editable.length() - 1, editable.length());
}
}
public enum Type {
integer, decimal
}
}