EditText只能输入2位小数及一个小数点

项目新需求:EditText输入的数值只能输入2位小数…

直接看结果的:

//只允许输入一个小数点和0--9的数字
mEditText.setKeyListener(new DigitsKeyListener(false, true));

想看详细的,往下看:

1.只允许输入2位小数

editText在xml里面添加了android:digits=".0123456789"

这需求挺简单的,妥妥的

mEditText.addTextChangedListener(new TextWatcher() {

            @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 s) {
                String editStr = s.toString().trim();

                int posDot = editStr.indexOf(".");
                //不允许输入3位小数,超过三位就删掉
                if (posDot < 0) {
                    return;
                }
                if (editStr.length() - posDot - 1 > 2) {
                    s.delete(posDot + 3, posDot + 4);
                } else {
                   //TODO...在这里写逻辑
                }
            }
        });

一运行,恩挺简单的,完美…
然后手贱试了下,我擦,居然符号和.可以输入多个…

难道是digits失效了?那换一个方法吧…
又在EditText的xml属性里面添加了android:inputType="numberDecimal"
to young…还是不行…

于是使用正则…不行
再使用InputFilter,发现有点用…但是还是能够输入多个”.”以及”-“

http://blog.csdn.net/a1533588867/article/details/53035475这是使用InputFilter链接…

我明明在speChat里面添加了”-“还是不行,而且还得额外监听…

2.换个方法,使用setInputType()方法
 private void setInputType(EditText edit) {
        edit.setKeyListener(new DigitsKeyListener() {
            @Override
            public int getInputType() {
                return InputType.TYPE_NUMBER_FLAG_DECIMAL;
            }

            @Override
            protected char[] getAcceptedChars() {
                String digists = "1234567890.";
                char[] data = digists.toCharArray();
                return data;
            }
        });
    }

实际使用发现xml里面设置digits并没有什么卵用,删掉…使用代码设置
clean,rebuild,run…

怎么弹出的是英文键盘….
怎么还能输入多个”.”….
我xml里面设置的难道和这边重写的重了?删掉这边重写的…

 private void setInputType(EditText edit) {
        edit.setKeyListener(new DigitsKeyListener() {
            @Override
            protected char[] getAcceptedChars() {
                String digists = "1234567890.";
                char[] data = digists.toCharArray();
                return data;
            }
        });
    }

再次运行…
弹出的是数字键盘,完美…
还是能输入多个”.”……….

要不写个逻辑判断一下”.”如果有多的”.”就给截掉算了…
还是再找找,应该有更完美的方法.

3.查看DigitsKeyListener源码

看看edit.setKeyListener(new DigitsKeyListener() {...}里面的DigitsKeyListener吧.

private char[] mAccepted;
private static final int SIGN = 1;
private static final int DECIMAL = 2;

private static final char[][] CHARACTERS = {
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' },
        { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' },
    };

/**
     * Allocates a DigitsKeyListener that accepts the digits 0 through 9,
     * plus the minus sign (only at the beginning) and/or decimal point
     * (only one per field) if specified.
     */
public DigitsKeyListener(boolean sign, boolean decimal) {
        mSign = sign;
        mDecimal = decimal;

        int kind = (sign ? SIGN : 0) | (decimal ? DECIMAL : 0);
        mAccepted = CHARACTERS[kind];
    }

这方法返回的是一个数组,我要的结果无疑是CHARACTERS[2].
看看SIGN=1,DECIMAL=2.
根据 | 的运算规则…
只有 kind = (00)B | (10)B = (10)B = 2;
也就是sign = false,decimal = true;

尝试设置一下

mEditText.setKeyListener(new DigitsKeyListener(false, true));

弹出的是数字键盘,不能输入其他符号,只能输入一个小数点…

最终:

//只允许输入一个小数点和0--9的数字
mEditText.setKeyListener(new DigitsKeyListener(false, true));
mEditText.addTextChangedListener(new TextWatcher() {

            @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 s) {
                String editStr = s.toString().trim();

                int posDot = editStr.indexOf(".");
                //不允许输入3位小数,超过三位就删掉
                if (posDot < 0) {
                    return;
                }
                if (editStr.length() - posDot - 1 > 2) {
                    s.delete(posDot + 3, posDot + 4);
                } else {
                    //TODO...这里写逻辑
                }
            }
        });
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值