天天看点

EditText限制小数位长度一、简述二、InputFilter三、DigitFilter实现

EditText限制小数位长度

  • 一、简述
      • 使用方式
  • 二、InputFilter
  • 三、DigitFilter实现

一、简述

在日常开发中,经常会遇到限制用户小数位长度的输入,我们可以通过设置InputFilter的方式来实现。
           

使用方式

二、InputFilter

InputFilter是一个接口,需要实现一个方法:
           
/**
* 这个方法将会在使用[start,end)来替换[dstart,dend)时被调用
* 返回值是你最终想要添加的文本,若返回""则表示放弃此次改变,若返回null则应用此次改变
* 当发生删除操作时source的长度将会是0
* 不要直接修改dest的内容,它的内容只是用来查看的。
*/
 public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend);
           

方法参数代表的含义

name type mean
source CharSequence 将要改变的内容
start int source的起始位置,为0(暂时没有发现其它值的情况)
end int source的结束位置,也就是source的长度
dest Spanned EditText中已经存在的内容
dstart int 插入点的位置
dend int 插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置

返回值说明

Return mean
“” 放弃此次改变,即不做任何更改 (删除操作除外)
null 应用本次改变,不做拦截
“abc” 将指定的字符串添加到输入框中

三、DigitFilter实现

下面是实现的DigitFilter, 有什么疑问请留言

public class DigitFilter extends DigitsKeyListener {

    private int digit;

    public DigitFilter(int digit) {
        this(true, true, digit);
    }

    /**
     * @param sign    是否支持负数
     * @param decimal 是否支持小数
     * @param digit   小数位
     */
    public DigitFilter(boolean sign, boolean decimal, int digit) {
        super(sign, decimal);
        this.digit = digit;
    }


    /**
     * @param source 将要插入的字符串,来自键盘输入、粘贴
     * @param start  source的起始位置,为0(暂时没有发现其它值的情况)
     * @param end    source的长度
     * @param dest   EditText中已经存在的字符串
     * @param dstart 插入点的位置
     * @param dend   插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置
     * @return
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        //先通过DigitsKeyListener过滤掉数字之外的操作
        CharSequence output = super.filter(source, start, end, dest, dstart, dend);
        if (output != null) {
            source = output;
        }
        //若source的长度为0并且dend>dstart则认为是删除操作
        if (source.length() == 0 && dend > dstart) {
            //若小数点前只有一位则不能删除
            if (dstart == 0) {
                if (dest.toString().indexOf(".") == 1) {
                    return dest.subSequence(dstart, dend);
                }
            }
        }

        //首位添加.的时候自动补零
        if (source.toString().equals(".") && dstart == 0) {
            return "0.";
        }

        //若首位是0,后面不能添加.之外的数字
        if (dest.toString().equals("0") && !source.toString().equals(".")) {
            return "";
        }

        int length = dest.toString().length();
        int pointIndex=0;
        //若小数位长度大于限制位数则放弃更改
        for (int i = 0; i < length; i++) {
            if (dest.charAt(i) == '.') {
                pointIndex=i;
            }
        }

        if (pointIndex!=0&&dend>pointIndex){
            if (length-pointIndex>digit){
                return "";
            }
        }
        return source;
    }


}

           

继续阅读