android 记一次 控制Edittext 控制只能输入两位小数

最近在项目中遇到了 要输入金钱的所以要控制两位小数,网上找了很多,但是都会输入出现1.6. 或者1..6这种状况,这里记一次,方便自己下回复制粘贴.O(∩_∩)O哈哈~(同时希望给碰到同样问题的有缘人帮助)

 

// editText监听输入小数位数
/**
 * 输入金额时的文本过虑器,可设置最大输入金额、小数点后位数
 *
 * @author Huangming  2018/8/15
 */
public class MoneyInputFilter implements InputFilter {

    /** 正则表达式:以0或正整数开头后跟0或1个(小数点后面跟0到2位数字) */
    private static final String FORMAT = "^(0|[1-9]\\d*)(\\.\\d{0,%s})?$";

    /** 正则表达式:0-9.之外的字符 */
    private static final Pattern SOURCE_PATTERN = Pattern.compile("[^0-9.]");

    /** 默认保留小数点后2位 */
    private Pattern mPattern = Pattern.compile(String.format(FORMAT, "2"));

    /** 允许输入的最大金额 */
    private double maxValue = Integer.MAX_VALUE;

    /**
     * 设置保留小数点后的位数,默认保留2位
     *
     * @param length
     */
    public void setDecimalLength(int length) {
        mPattern = Pattern.compile(String.format(FORMAT, length));
    }

    /**
     * 设置允许输入的最大金额
     *
     * @param maxValue
     */
    public void setMaxValue(double maxValue) {
        this.maxValue = maxValue;
    }

    /**
     * 当系统使用source的start到end的字串替换dest字符串中的dstart到dend位置的内容时,会调用本方法
     *
     * @param source 新输入的字符串
     * @param start 新输入的字符串起始下标,一般为0(删除时例外)
     * @param end 新输入的字符串终点下标,一般为source长度-1(删除时例外)
     * @param dest 输入之前文本框内容
     * @param dstart 原内容起始坐标,一般为dest长度(删除时例外)
     * @param dend 原内容终点坐标,一般为dest长度(删除时例外)
     * @return 你希望输入的内容,比如当新输入的字符串为“恨”时,你希望把“恨”变为“爱”,则return "爱"
     */
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        // 删除时不用处理
        if (TextUtils.isEmpty(source)) {
            return null;
        }

        // 不接受数字、小数点之外的字符
        if (SOURCE_PATTERN.matcher(source).find()) {
            return "";
        }

        SpannableStringBuilder ssb = new SpannableStringBuilder(dest);
        ssb.replace(dstart, dend, source, start, end);
        Matcher matcher = mPattern.matcher(ssb);
        if (matcher.find()) {
            String str = matcher.group();
            Log.d("匹配到的字符串=%s", str);

            //验证输入金额的大小
            double value = Double.parseDouble(str);
            if (value > maxValue) {
                return "";
            }
            return source;
        } else {
            Log.w("不匹配的字符串=%s", ssb.toString());
            return "";
        }
    }
}

使用方法

MoneyInputFilter filter = new MoneyInputFilter();
 filter.setDecimalLength(3);//保留小数点后3位
 filter.setMaxValue(10000);// 最多可输入1万元
 InputFilter[] filters = {filter};
 edit_money.setFilters(filters);

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值