EditText 设置最大小数位数

Posted ggband

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EditText 设置最大小数位数相关的知识,希望对你有一定的参考价值。

一、方案:
@1、addTextChangedListener
缺点:保留指定位数后,还是会执行其他附加的TextChangedListener

@2、InputFilter
完美解决addTextChangedListener实现的缺点
二、基于InputFilter实现
1、InputFilter 工具类

/**
 * ggband
 * 限制 小数和整数的位数
 */
public class InputNumLengthFilter implements InputFilter {

    private int maxPoint;
    private int maxInteger;
    public InputNumLengthFilter(int maxPoint, int maxInteger) {
        this.maxPoint = maxPoint;
        this.maxInteger = maxInteger;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        int maxLength = maxInteger + maxPoint + 1;
        // 删除等特殊字符,直接返回
        if (nullFilter(source)) return null;
        String dValue = dest.toString();
        String[] splitArray = dValue.split("\.");//在点前后分开两段
        if (splitArray.length > 0) {
            String intValue = splitArray[0];
            int errorIndex = dValue.indexOf(".");
            if (errorIndex == -1) {
                errorIndex = dValue.length();
            }
            if (intValue.length() >= maxLength - maxPoint - 1 && dstart <= errorIndex) {
                if (".".equals(source.toString())) {
                    return null;
                }
                return "";
            }
        }
        if (splitArray.length > 1 && dstart == dValue.length()) {
            String dotValue = splitArray[1];
            int diff = dotValue.length() + 1 - maxPoint;
            if (diff > 0) {
                try {
                    return source.subSequence(start, end - diff);
                } catch (IndexOutOfBoundsException e) {
                    return source;
                }
            }
        }
        if (dest.length() == maxLength - 1 && ".".equals(source.toString())) {
            return "";
        }
        if (dest.length() >= maxLength) {
            return "";
        }
        return null;
    }

    //  第一个参数是小数部分的位数,第二个参数是总长度(包括小数点)

    private boolean nullFilter(CharSequence source) {
       return source.toString().isEmpty();
    }
}

  

 2、ViewHelper工具类:

/**
 * 让一个输入框只能输入指定位数小数 和整数位
 *
 * @param editText   EditText
 * @param maxInteger 最大整数位数
 * @param maxPoint   最大小数位数
 *  create by ggband
 */
public static void setPricePointWithInteger(final EditText editText, final int maxPoint, final int maxInteger, InputFilter... inputFilters) {
    if (inputFilters == null || inputFilters.length == 0) {
        editText.setFilters(new InputFilter[]{new InputNumLengthFilter(maxPoint, maxInteger)});
    } else {
        InputFilter[] newInputFilters = new InputFilter[inputFilters.length + 1];
        System.arraycopy(inputFilters, 0, newInputFilters, 0, inputFilters.length);
        newInputFilters[inputFilters.length] = new InputNumLengthFilter(maxPoint, maxInteger);
        editText.setFilters(newInputFilters);
    }

}
3、使用:
ViewHelper.setPricePointWithInteger(etCpu, 4, 10)

  

以上是关于EditText 设置最大小数位数的主要内容,如果未能解决你的问题,请参考以下文章

R语言:小数点位数的设置

限定EditText小数位数

EditText 限制输入整数和小数 的位数

Android Edittext限制输入小数位数,限制输入数字大小及所有相关式样与属性(总结)

java怎么把小数转为分母为一位数的分数

double 小数点后允许的最大位数