Android-EditText兩種方法限制輸入兩位小數
阿新 • • 發佈:2019-02-02
為什麼有這個需求
說實話,這個需求簡直可以說無處不在了,因為,只要有輸入金額的需求,客戶端限制輸入位數幾乎是肯定的。
功能點分析
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 。
歡迎關注博主的微信公眾號,快快加入哦,期待與你一起成長!