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)

  

原文地址:https://www.cnblogs.com/ggband/p/11815897.html

时间: 2024-10-27 13:38:53

EditText 设置最大小数位数的相关文章

android edittext 限制输入框小数位数

先看下XML布局文件 <EditText android:id="@+id/et" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toLeftOf="@+id/tv_count" android:background="@null" android:hint="@

double四舍五入,商品金额大小写转换,设置货币的小数位数跟格式输出,进制转化

1:计算double值四舍五入的方法 对小数数值进行四舍五入,首先应该确认保留小数位, 如果数值的小数精度大于保留小数位,那么开始四舍五入计算.四舍五入的方法非常简单,在所有要丢失精度的小数位中加5,如果大于10则向前进位,最后计算出四舍五入的结果. /// <summary>计算double值四舍五入的方法 /// /// </summary> /// <param name="dbl">进行四舍五入的数值</param> /// &l

JS中保留小数位数

一.1.2.toFixed(2) 浮点数进行四舍五入设置指定小数位的数值 二.2.toFixed(2) 整数尝试,但是在JS中会被认为是对象名,以至于无法使用 三."1.2".toFixed(2) 由于toFixed方法是针对Number类型的,所以string类型的即使能够转换成数字,也不能使用这个方法 四.var a=1;a.toFixed(2); 构造整数对象,那么就可以调用了 http://www.w3school.com.cn/jsref/jsref_tofixed.asp

Android: EditText设置属性和设置输入规则

1.EditText输入限制规则 在xml:EditText 设置属性 android:digits="ABCDE123&*" ABCDE123&*是你的限制规则 例如:android:digits="0123456789abc" 规则是只能输入英文字母(小写)abc和数字 2.EditTex输入的文字为密码形式 (1)在xml中设置 android:password="true" //以"."形式显示文本 (

润乾报表之日期格式、小数位数

日期格式: 数据库里面查询出来的日期格式有可能不是我们要显示的格式,比如TIMESTAMP显示到了纳秒级别.这里面介绍俩种我用到的 规定日期格式的两种方式:第一种,sql文里面转换:第二种,单元格显示格式进行设置.这里推荐第一种,因为遇到过报表里面设定了 显示格式,报表里面预览是有效果的,但是到项目里面预览的时候不起作用. sql文转换:to_char() 单元格式设置:选中单元格-->右侧,双击行为“显示格式”列为“值”的单元格,此时可以看到很多选择,对于日期选项,选择你想要的 格式即可.如图

在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)

//在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数) function formatNum(num, n) {//参数说明:num 要格式化的数字 n 保留小数位 num = String(num.toFixed(n)); var re = /(-?\d+)(\d{3})/; while (re.test(num)) num = num.replace(re, "$1,$2") ret

转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

关于处理小数点位数的几个oracle函数() 1. 取四舍五入的几位小数 select round(1.2345, 3) from dual; 结果:1.235 2. 保留两位小数,只舍 select trunc(1.2345, 2) from dual; 结果:1.23 select trunc(1.2399, 2) from dual; 结果:1.23 3.取整数 返回大于或等于x的最大整数: SQL> select ceil(23.33) from dual; 结果: 24 返回等于或小于

Java学习-047-数值格式化及小数位数四舍五入

此小工具类主要用于数值四舍五入.数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍五入法)中四舍五入法有如下 7 种: 1. ROUND_UP:远离零方向舍入.向绝对值最大的方向舍入,只要舍弃位非0即进位. 2. ROUND_DOWN:趋向零方向舍入.向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况. 3. ROUND_CEILING:向正无穷方向舍入.向正最大方向靠拢.

js数据保留小数位数

1000.12345.toFixed(2)=1000.12: 1000.12987.toFixed(2)=1000.13: 1000.1.toFixed(2)=1000.10 js数据保留小数位数,布布扣,bubuko.com