小數位數過濾控制EditInputFilter


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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章