public class EditInputFilter implements InputFilter {
/**
* 最大數字
*/
public double MAX_VALUE = 5000000;
/**
* 小數點後的數字的位數
*/
private int POINTER_LENGTH = 2;
private String POINTER = ".";
Pattern p;
public EditInputFilter() {
//用於匹配輸入的是0-9 . 這幾個數字和字符
p = Pattern.compile("([0-9]|\\.)*");
}
/**
* source 新輸入的字符串
* start 新輸入的字符串起始下標,一般爲0
* end 新輸入的字符串終點下標,一般爲source長度-1
* dest 輸入之前文本框內容
* dstart 原內容起始座標,一般爲0
* dend 原內容終點座標,一般爲dest長度-1
*/
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
String sourceText = source.toString();
String destText = dest.toString();
//驗證刪除等按鍵
if (TextUtils.isEmpty(sourceText)) {
if (dstart == 0 && destText.indexOf(POINTER) == 1) {//保證小數點不在第一個位置
return "0";
}
return "";
}
Matcher matcher = p.matcher(source);
//已經輸入小數點的情況下,只能輸入數字
if (destText.contains(POINTER)) {
if (!matcher.matches()) {
return "";
} else {
if (POINTER.equals(source)) { //只能輸入一個小數點
return "";
}
}
//驗證小數點精度,保證小數點後只能輸入兩位
int index = destText.indexOf(POINTER);
int length = destText.trim().length() - index;
if (length > POINTER_LENGTH && dstart > index) {
return "";
}
} else {
//沒有輸入小數點的情況下,只能輸入小數點和數字,但首位不能輸入小數點和0
if (!matcher.matches()) {
return "";
} else {
if ((POINTER.equals(source)) && dstart == 0) {//第一個位置輸入小數點的情況
return "0.";
} else if ("0".equals(source) && dstart == 0){
//用於修復能輸入多位0
return "";
}
}
}
// dstart
//修復當光標定位到第一位的時候 還能輸入其他的 這個是爲了修復以下的情況
/**
* <>
* 當如下情況的時候 也就是 已經輸入了23.45 這個時候限制是500元
* 那麼這個時候如果把光標移動2前面 也就是第0位 在輸入一個5 那麼這個實際的參與下面的
* 判斷的sumText > MAX_VALUE 是23.455 這個是不大於 500的 但是實際情況是523 這個時候
* 已經大於500了 所以之前的是存在bug的 這個要進行修正 也就是拿到的比較數應該是523.45 而不是23.455
* 所以有了下面的分隔 也就是 把23.45 (因爲這個時候dstart=0) 分隔成 "" 和23.45 然後把 5放到中間
* 進行拼接 也就是 "" + 5 + 23.45 也就是523.45 然後在進行和500比較
* 還有一個比較明顯的就是 23.45 這個時候光標在2和3 之間 那麼如果修正之前 是23.455 修正之後 dstart = 1
* 這個時候分隔是 "2" "3.45" 這個時候拼接是253.45 然後和500比較 以此類推
* </>
*/
String first = destText.substring(0,dstart);
String second = destText.substring(dstart,destText.length());
// dend
String sum = first + sourceText + second;
//驗證輸入金額的大小
double sumText = Double.parseDouble(sum);
//這裏得到輸入完之後需要計算的金額 如果這個金額大於了事先設定的金額,那麼久直接返回 不需要加入輸入的字符
if (sumText > MAX_VALUE) {
//
return dest.subSequence(dstart, dend);
}
//如果輸入的金額小於事先規定的金額
return dest.subSequence(dstart, dend) + sourceText;
}
public void setMAX_VALUE(double MAX_VALUE) {
this.MAX_VALUE = MAX_VALUE;
}
public void setPOINTER_LENGTH(int POINTER_LENGTH) {
this.POINTER_LENGTH = POINTER_LENGTH;
}
}