美文网首页
EditText中限制整数和小数的位数

EditText中限制整数和小数的位数

作者: 好学人 | 来源:发表于2020-01-21 16:56 被阅读0次

业务背景

公司的产品是一款金融类APP,在用户输入金额时需要限定用户输入的整数位数以及小数位数。比如,限制用户最多能输入6位整数,4位小数。

思路分析

  1. 如果输入的内容以.开头,自动在首位插入一个0

  2. 如果首位是0,且其后为数字,否则删除首位的0

  3. 如果整数部分或小数部分已达到限制,则掐头去尾。

实现代码

res/values/attrs.xml中添加自定义属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="DigitEditText">
        <attr name="maxInteger" format="integer" />
        <attr name="maxDecimal" format="integer" />
    </declare-styleable>
</resources>

自定义EditText监听器限制输入规则

/**
 * 支持通过自定义属性配置最多输入的整数和小数位数
 * <p>
 * maxInteger:最多输入的整数位数
 * maxDecimal:最多输入的小数位数
 * <p>
 * create by haoxueren on 2020/3/4
 */
public class DigitEditText extends AppCompatEditText implements TextWatcher {

    private int position = 0; // 超出当前限定的位数,删除新输入的数字

    private AttributeHolder holder;

    public DigitEditText(Context context) {
        this(context, null);
    }

    public DigitEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        holder = new AttributeHolder(context, attrs);
        this.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
        this.addTextChangedListener(this);
    }

    public void setMaxInteger(int maxInteger) {
        holder.setMaxInteger(maxInteger);
    }

    public void setMaxDecimal(int maxDecimal) {
        holder.setMaxDecimal(maxDecimal);
    }

    /**
     * 限制EditText输入,最多位整数,小数
     */
    @Override
    public void afterTextChanged(Editable editable) {
        String text = editable.toString();
        // 小数点前自动补0
        if (text.matches("[.]\\d*")) {
            editable.insert(0, "0");
            return;
        }
        // 删除数字前的0(逐位删除)
        if (text.matches("0[0-9][0-9.]*")) {
            editable.delete(0, 1);
            return;
        }
        // 最多输入6位整数(逐位删除)
        if (text.matches(holder.integerRegex)) {
            editable.delete(0,  1);
            return;
        }
        // 最多输入4位小数(逐位删除)
        if (text.matches(holder.decimalRegex)) {
            int last = this.length();
            editable.delete(last-1, last);
            return;
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        this.position = start;
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    class AttributeHolder {

        private String integerRegex;
        private String decimalRegex;

        AttributeHolder(Context context, AttributeSet attrs) {
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DigitEditText);
            // 整数最大位数,默认为10
            int maxInteger = typedArray.getInt(R.styleable.DigitEditText_maxInteger, 10);
            // 小数最大位数,默认为10
            int maxDecimal = typedArray.getInt(R.styleable.DigitEditText_maxDecimal, 10);
            integerRegex = String.format(Locale.CHINA, "\\d{%d,}[0-9.]*", maxInteger + 1);
            decimalRegex = String.format(Locale.CHINA, "\\d+[.]\\d{%d,}", maxDecimal + 1);
            typedArray.recycle();
        }

        private void setMaxInteger(int maxInteger) {
            integerRegex = String.format(Locale.CHINA, "\\d{%d,}[0-9.]*", maxInteger + 1);
        }

        private void setMaxDecimal(int maxDecimal) {
            decimalRegex = String.format(Locale.CHINA, "\\d+[.]\\d{%d,}", maxDecimal + 1);
        }
    }


}

使用方法

<com.haoxueren.library.view.DigitEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:maxDecimal="4"
    app:maxInteger="6" />

相关文章

  • EditText中限制整数和小数的位数

    业务背景 公司的产品是一款金融类APP,在用户输入金额时需要限定用户输入的整数位数以及小数位数。比如,限制用户最多...

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

    直接上代码 新建DecimalInputTextWatcher类继承TextWatcher(代码可直接复制使用) 使用

  • Android EditText 小数输入优化

    ———通过EditText输入小数时,可指定整数或小数的位数 如需下载源码,请访问https://github.c...

  • (优化)Android EditText限制输入整数和小数的位数

    最近刚做安卓,一些小笔记。参考网上的案例,修复了小bug。 使用方法: 源码

  • Java笔记

    两个整数相除得到小数并限制小数位数 Math 的 floor、round、ceil 函数 获取星期名字数组和月份名...

  • 常用方法

    vue element中input限制只能输入正整数 vue input 只允许输入整数、整数和小数(保留小数点后...

  • 限制输入框小数位数和总位数

    1、限制输入框小数位数和输入框的总位数 2、限制输入框小数位数

  • 数学日记

    第一单元,我们学习了,小位数,除于整数,和小数除以小数,还有小数除以整数,还有,还有带循环小数和不循环小数,还有...

  • 数学日记

    第一单元,我们学习了,小位数,除于整数,和小数除以小数,还有小数除以整数,还有,还有带循环小数和不循环小数,还有无...

  • Android EditText 限制输入小数位数

    首先提到一个输入过滤器,用来约束用户输入的内容关键接口:InputFilters我们现在要做的就是重写这个接口 调用示例

网友评论

      本文标题:EditText中限制整数和小数的位数

      本文链接:https://www.haomeiwen.com/subject/evbjzctx.html