用法
//第一种
// InputFilter[] filters = {new CashierInputFilter()};
// edShopPrice.setFilters(filters);
// edMarketPrice.setFilters(filters);
//第二种
edShopPrice.setFilters(new InputFilter[]{new MoneyValueFilter().setDigits(2)});
edMarketPrice.setFilters(new InputFilter[]{new MoneyValueFilter().setDigits(2)});
这个不会补全0. 会限制输入最大数
public class CashierInputFilter implements InputFilter {
Pattern mPattern;
//输入的最大金额
private static final int MAX_VALUE = Integer.MAX_VALUE;
//小数点后的位数
private static final int POINTER_LENGTH = 2;
private static final String POINTER = ".";
private static final String ZERO = "0";
public CashierInputFilter() {
mPattern = Pattern.compile("([0-9]|\\.)*");
}
/**
* @param source 新输入的字符串
* @param start 新输入的字符串起始下标,一般为0
* @param end 新输入的字符串终点下标,一般为source长度-1
* @param dest 输入之前文本框内容
* @param dstart 原内容起始坐标,一般为0
* @param dend 原内容终点坐标,一般为dest长度-1
* @return 输入内容
*/
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String sourceText = source.toString();
String destText = dest.toString();
//验证删除等按键
if (TextUtils.isEmpty(sourceText)) {
return "";
}
Matcher matcher = mPattern.matcher(source);
//已经输入小数点的情况下,只能输入数字
if (destText.contains(POINTER)) {
if (!matcher.matches()) {
return "";
} else {
if (POINTER.equals(source)) { //只能输入一个小数点
return "";
}
}
//验证小数点精度,保证小数点后只能输入两位
int index = destText.indexOf(POINTER);
int length = dend - index;
if (dstart > index && destText.length() - index > POINTER_LENGTH) {
return "";
}
} else {
//没有输入小数点的情况下,只能输入小数点和数字,但首位不能输入小数点和0
if (!matcher.matches()) {
return "";
} else {
if ((POINTER.equals(source) || ZERO.equals(source)) && TextUtils.isEmpty(destText)) {
return "";
}
}
}
//验证输入金额的大小
double sumText = Double.parseDouble(destText + sourceText);
if (sumText > MAX_VALUE) {
return dest.subSequence(dstart, dend);
}
return dest.subSequence(dstart, dend) + sourceText;
}
}
先输小数点自动补全0.
public class MoneyValueFilter extends DigitsKeyListener {
private static final String TAG = "MoneyValueFilter";
public MoneyValueFilter() {
super(false, true);
}
private int digits = 2;
public MoneyValueFilter setDigits(int d) {
digits = d;
return this;
}
@Override
public 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 source
if (out != null) {
source = out;
start = 0;
end = out.length();
}
int len = end - start;
// if deleting, source is empty
// and deleting can't break anything
if (len == 0) {
return source;
}
//以点开始的时候,自动在前面添加0
if(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 right
return (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 right
if ((dlen-dend) + (end-(i + 1)) > digits)
return "";
else
break; // return new SpannableStringBuilder(source, start, end);
}
}
// if the dot is after the inserted part,
// nothing can break
return new SpannableStringBuilder(source, start, end);
}
}