1.设置EditText控件类型为实数
android:inputType="numberDecimal" (无符号的浮点数) android:inputType="numberSigned|numberDecimal"(有符号的浮点数)
2.创建一个输入过滤器InputFilter
/**
* 用于控制EditText最大输入小数点前位数和小数点后位数 <br/>
* 示例 : mEditText.setFilters(DecimalDigitsInputFilter.getFilters(new DecimalDigitsInputFilter(5, 2))); <br/><br/>
* 来源参考 : https://stackoverflow.com/questions/27077507/android-how-to-only-allow-a-certain-number-of-decimal-places
*
* @author savet
*/
public class DecimalDigitsInputFilter implements InputFilter {
// 正则匹配
private final Pattern mPattern;
/**
* 构建一个用于控制EditText最大输入小数点前位数和小数点后位数的输入过滤器
*
* @param digitsBeforeZero 小数点之前的位数
* @param digitsAfterZero 小数点之后的位数
*/
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
String pattern = "^\\-?(\\d{0," + (digitsBeforeZero) + "}|\\d{0," + (digitsBeforeZero) + "}\\.\\d{0," + digitsAfterZero + "})$";
mPattern = Pattern.compile(pattern);
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned destination, int destinationStart, int destinationEnd) {
if (end > start) {
// adding: filter
// build the resulting text
String destinationString = destination.toString();
String resultingTxt = destinationString.substring(0, destinationStart)
+ source.subSequence(start, end)
+ destinationString.substring(destinationEnd);
// return null to accept the input or empty to reject it
return resultingTxt.matches(this.mPattern.toString()) ? null : "";
}
// removing: always accept
return null;
}
public static InputFilter[] getFilters(InputFilter inputFilter) {
return new InputFilter[]{inputFilter};
}
}
3.给自己的EditText控件设置输入过滤器InputFilter
mEditText.setFilters(DecimalDigitsInputFilter.getFilters(new DecimalDigitsInputFilter(5, 2)));