import android.text.Spanned;
import android.text.TextUtils;
public class DecimalDigitsInputFilter implements InputFilter {
private final int mMaxIntegerDigits;
private final int mMaxFractionDigits;
public DecimalDigitsInputFilter(int maxIntegerDigits, int maxFractionDigits) {
super();
this.mMaxIntegerDigits = maxIntegerDigits;
this.mMaxFractionDigits = maxFractionDigits;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
// 先处理删除的情况
if (TextUtils.isEmpty(source)) {
return null;
}
String newVal = dest.toString().substring(0, dstart) + source + dest.toString().substring(dend);
boolean isPointEntered = newVal.contains(".");
int indexOfPoint;
int integerDigits;
int fractionDigits;
if (isPointEntered) {
indexOfPoint = newVal.indexOf(".");
integerDigits = indexOfPoint;
fractionDigits = newVal.length() - 1 - indexOfPoint;
if (fractionDigits > mMaxFractionDigits) {
return newVal.substring(0, indexOfPoint + mMaxFractionDigits + 1);
} else {
return null; // 如果是小数点之后的输入,允许输入,但要检查长度是否超标
}
} else {
integerDigits = newVal.length();
if (integerDigits > mMaxIntegerDigits) { // 没有小数点时,检查整数部分的长度是否超标
return dest.subSequence(0, mMaxIntegerDigits); // 超出则截断到最大整数位长度
} else {
return null; // 允许输入,但要检查小数点后的位数是否超标
}
}
}
}
一般会限制一下EditText的输入类型
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal" /> <!-- 只允许数字和小数点 -->
***************使用的时候如下************************
EditText editText = findViewById(R.id.editText);
InputFilter filter = new DecimalDigitsInputFilter(5, 2); // 允许最多5位整数和2位小数
editText.setFilters(new InputFilter[]{filter});