• 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)
    

      

    ggband
  • 相关阅读:
    SGU 495 Kids and Prizes 概率DP 或 数学推理
    poj 2799 IP Networks 模拟 位运算
    uva 202 Repeating Decimals 模拟
    poj 3158 Kickdown 字符串匹配?
    uva 1595 Symmetry 暴力
    uva 201 Squares 暴力
    uva 1594 Ducci Sequence 哈希
    uva 1368 DNA Consensus String 字符串
    数字、字符串、列表的常用操作
    if条件判断 流程控制
  • 原文地址:https://www.cnblogs.com/ggband/p/11815897.html
Copyright © 2020-2023  润新知