在我們實際開發中,當涉及到金額輸入的時候,必定會涉及到EditText輸入小數位數的問題,下面就是如何實作限制輸入框後面小數位數和輸入的數字大小。
首先,我們要知道EditText的api中能夠實作的這個功能需要使用哪個api。
第一種:使用InputFilter (這個英文直譯應該叫輸入過濾器吧)
不廢話,直接上代碼,注釋上很清楚。
<span style="font-size:18px;">public class EditInputFilter implements InputFilter{
/**
* 最大數字
*/
public static final int MAX_VALUE = 10000;
/**
* 小數點後的數字的位數
*/
public static final int PONTINT_LENGTH = 2;
Pattern p;
public EditInputFilter(){
p = Pattern.compile("[0-9]*"); //除數字外的其他的
}
/**
* source 新輸入的字元串
* start 新輸入的字元串起始下标,一般為0
* end 新輸入的字元串終點下标,一般為source長度-1
* dest 輸入之前文本框内容
* dstart 原内容起始坐标,一般為0
* dend 原内容終點坐标,一般為dest長度-1
*/
@Override
public CharSequence filter(CharSequence src, int start, int end,
Spanned dest, int dstart, int dend) {
String oldtext = dest.toString();
System.out.println(oldtext);
//驗證删除等按鍵
if ("".equals(src.toString())) {
return null;
}
//驗證非數字或者小數點的情況
Matcher m = p.matcher(src);
if(oldtext.contains(".")){
//已經存在小數點的情況下,隻能輸入數字
if(!m.matches()){
return null;
}
}else{
//未輸入小數點的情況下,可以輸入小數點和數字
if(!m.matches() && !src.equals(".") ){
return null;
}
}
//驗證輸入金額的大小
if(!src.toString().equals("")){
double dold = Double.parseDouble(oldtext+src.toString());
if(dold > MAX_VALUE){
CustomerToast.showToast(RechargeActivity.this, "輸入的最大金額不能大于MAX_VALUE");
return dest.subSequence(dstart, dend);
}else if(dold == MAX_VALUE){
if(src.toString().equals(".")){
CustomerToast.showToast(RechargeActivity.this, "輸入的最大金額不能大于MAX_VALUE");
return dest.subSequence(dstart, dend);
}
}
}
//驗證小數位精度是否正确
if(oldtext.contains(".")){
int index = oldtext.indexOf(".");
int len = dend - index;
//小數位隻能2位
if(len > PONTINT_LENGTH){
CharSequence newText = dest.subSequence(dstart, dend);
return newText;
}
}
return dest.subSequence(dstart, dend) +src.toString();
}
} </span><span style="font-size:24px;"> </span>
*ps:CustomerToast隻是一個稍微配置了一下的Toast控件,避免有多個提醒的時候,會接連不斷的出現。
使用方式:
InputFilter[] filters = { new EditInputFilter() };
edit.setFilters(filters);
你也可以吧上面的過濾器拆分為多個過濾器!這樣以後有其他的需求的時候就可以自由混搭了!!
第二種 方式:addTextChangedListener(textwatcher),這種方式是對輸入框添加一個内容監聽,其中TextWatcher實作類中需要重寫三個方法,
onTextChanged,beforeTextChanged,afterTextChanged,分别對應的是在edittext内容變化時,變化前,和變化後。ps:這些方法都是在輸入框内容變化之前調用的,這種方式主要是對目前輸入框中的内容進行一個驗證,看是否能符合我們的規則。
代碼就不寫來,規則大緻和上面有點像,但是比上面的那種要難處理一點。