zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ifconfig详解
    ln命令总结
    2008年国外最佳Web设计/开发技巧、脚本及资源总结
    金刚经全译文
    Ifconfig网络配置工具详解
    High Availability PostgreSQL HOWTO
    女人新标准
    JFreeChart API文档
    云计算火热背后:标准及安全成首要问题 狼人:
    Adobe Reader 9.3.2发布 修补15个安全漏洞 狼人:
  • 原文地址:https://www.cnblogs.com/ggband/p/11815897.html
Copyright © 2011-2022 走看看