Android EditText 输入金额保留小数点后2位

Android EditText 输入金额保留小数点后2位

开发中经常会遇到要让用户输入金额的情况,并且还可能有些其它的要求,比如小数点后不能多于2位,最大金额不能超过某个值等等,一开始遇到这种需求时会觉得这个似乎挺简单的,但写代码的时候却发现要写好也不容易,索性写了个工具,以后要用到的时候就直接用了。

多的不说了,直接上代码:

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

    private static final String FORMAT = "(^([0-9]+))((\\.([0-9]{1,%s}))?)";

    private static final Pattern sourcePattern = Pattern.compile("[^0-9.]");

    private static Pattern mPattern = Pattern.compile(String.format(FORMAT, 2));

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

    private static final String POINT = ".";

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

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

    /**
     * 当系统使用source的start到end的字串替换dest字符串中的dstart到dend位置的内容时,会调用本方法
     *
     * @param source 新输入的字符串
     * @param start 新输入的字符串起始下标,一般为0(删除时例外)
     * @param end 新输入的字符串终点下标,一般为source长度(删除时例外)
     * @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) {
        String sourceText = source.toString().trim();
        String destText = dest.toString().trim();

        // XbdLog.d("输入前字符串=%s,dstart=%s,dend=%s", destText, dstart, dend);
        // XbdLog.d("新输入字符串=%s,start=%s,end=%s", sourceText, start, end);

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

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

        // 输入小数点的情况
        if (POINT.equals(sourceText)) {
            if (TextUtils.isEmpty(destText)) {
                // 不可以小数点开头
                return "";
            } else {
                return null;
            }
        }

        String newText = source.subSequence(start, end).toString().trim();
        String temp = destText + newText;
        Matcher matcher = mPattern.matcher(temp);
        if (matcher.find()) {
            String str = matcher.group();
            XbdLog.d("匹配到的字符串=%s", str);
            String s2 = str.replace(destText, "");

            //验证输入金额的大小
            double value = Double.parseDouble(str);
            if (value > MAX_VALUE) {
                return "";
            }
            return s2;
        } else {
            return "";
        }
    }
}

用法:

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

过滤器实现了InputFilter接口,接口下的filter方法值得仔细了解,注释上已经写了主要的用法。还有一些注意事项没写出来,官方文档中的原文如下:

Android EditText 输入金额保留小数点后2位




由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享、探讨!

博客:http://blog.csdn.net/MingHuang2017

GitHub:https://github.com/MingHuang1024

Email: [email protected]

微信:724360018