import android.text.InputFilter
;
import android.text.Spanned
;
import android.text.TextUtils
;
import java.util.regex.Matcher
;
import java.util.regex.Pattern
;
/**
* 金钱输入过滤器
* Created by Shark on 2016/8/31.
*/
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) {
// Log.e("CashierInputFilter","新输入的字符串source="+source);
// Log.e("CashierInputFilter","新输入的字符串起始下标start="+start);
// Log.e("CashierInputFilter","新输入的字符串终点下标end="+end);
// Log.e("CashierInputFilter","输入之前文本框内容dest="+dest);
// Log.e("CashierInputFilter","原内容起始坐标dstart="+dstart);
// Log.e("CashierInputFilter","原内容终点坐标dend="+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 "";
}
}
//验证小数点精度,保证小数点后只能输入1位
int index = destText.indexOf(POINTER)
;
int destLength = destText.length()
;
int length = dend - index
;
if (length > POINTER_LENGTH) {
return dest.subSequence(dstart
, dend)
;
}
//已经有POINTER_LENGTH位小数 不能再加小数
if (destLength - index > POINTER_LENGTH && dstart > index) {
return dest.subSequence(dstart
, dend)
;
}
}
else {
//没有输入小数点的情况下,只能输入小数点和数字,但首位不能输入小数点和0
if (!matcher.matches()) {
return "";
}
else {
if ((POINTER.equals(source)) && TextUtils.isEmpty(destText)) {
return "";
}
//只能在后POINTER_LENGTH位加"."
int destLength = destText.length()
;
if (POINTER.equals(source) && destLength - dend > POINTER_LENGTH) {
return "";
}
//如果首位为“.”,则输“0.”
if (POINTER.equals(source) && dstart ==
0) {
return "0.";
}
//如果首位为“0”,则只能再输“.”
if (ZERO.equals(destText)) {
if (!POINTER.equals(sourceText)) {
return "";
}
}
}
}
//验证输入金额的大小
double sumText = Double.parseDouble(destText + sourceText)
;
if (sumText > MAX_VALUE) {
return dest.subSequence(dstart
, dend)
;
}
return dest.subSequence(dstart
, dend) + sourceText
;
}
}