作者:兜子
需求背景
我们需要做一个金额输入过滤器,限制小数点后只能输入两位数,以下解决方案,部分使用kotlin语言。
解决方案
- EditText的属性中先设置android:inputType=”numberDecimal”属性
- 新建一个类,继承DigitsKeyListener
public class MoneyValueFilter extends DigitsKeyListener {public MoneyValueFilter() {super(false, true);}private int digits = 2;public MoneyValueFilter setDigits(int d) {digits = d;return this;}@Overridepublic CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {CharSequence out = super.filter(source, start, end, dest, dstart, dend);// if changed, replace the sourceif (out != null) {source = out;start = 0;end = out.length();}int len = end - start;// if deleting, source is empty// and deleting can't break anythingif (len == 0) {return source;}//以点开始的时候,自动在前面添加0if(source.toString().equals(".") && dstart == 0){return "0.";}//如果起始位置为0,且第二位跟的不是".",则无法后续输入if(!source.toString().equals(".") && dest.toString().equals("0")){return "";}int dlen = dest.length();// Find the position of the decimal .for (int i = 0; i < dstart; i++) {if (dest.charAt(i) == '.') {// being here means, that a number has// been inserted after the dot// check if the amount of digits is rightreturn (dlen-(i+1) + len > digits) ?"" :new SpannableStringBuilder(source, start, end);}}for (int i = start; i < end; ++i) {if (source.charAt(i) == '.') {// being here means, dot has been inserted// check if the amount of digits is rightif ((dlen-dend) + (end-(i + 1)) > digits)return "";elsebreak; // return new SpannableStringBuilder(source, start, end);}}// if the dot is after the inserted part,// nothing can breakreturn new SpannableStringBuilder(source, start, end);}}
- 在代码中设置过滤器
etAbleWithdrawMoney.filters = arrayOf(MoneyValueFilter())
