转载:http://www.codes51.com/article/detail_228321.html
需求:设置一个EditText仅能输入数字且输入的数字中小数部分最多可以有两位。
第一步:在XML文件中,将EditText的inputType设置成NumberDecimal:
<EditText
。。。
android:inputType="numberDecimal"
。。。
/>
第二部,代码中修改EditText 的addTextChangedListener 方法,同样的先上代码,再来解释:
EditText.addTextChangedListener(new TextWatcher() {
private int count_decimal_points_ = 0; // 标识当前是不是已经有小数点了
private int selection_start_; // 监听光标的位置
private StringBuffer str_buf_; // 缓存当前的string,用以修改内容
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
str_buf_ = new StringBuffer(s.toString().trim());
// 先判断输入的第一位不能是小数点
if (before == 0 && s.length() == 1 && s.charAt(start) == '.') {
recharge_money.setText("");
} else if (before == 0 && count_decimal_points_ == 1) {
// 再判断如果当前是增加,并且已经有小数点了,就要判断输入是否合法;如果是减少不做任何判断
// 非合法的输入包括: 1. 输入的依旧是小数点,2.小数点后位数已经达到两位了
if (s.charAt(start) == '.' || (start - str_buf_.indexOf(".")> 2) ) {
str_buf_.deleteCharAt(start);
recharge_money.setText(str_buf_);
} else {
selection_start_ = str_buf_.length();// 设置光标的位置为结尾
}
} else {
selection_start_ = str_buf_.length();// 设置光标的位置为结尾
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
if (s.toString().contains(".")) {
count_decimal_points_ = 1;
} else {
count_decimal_points_ = 0; // 因为可能存在如果是删除的话,把小数点删除的情况
}
}
@Override
public void afterTextChanged(Editable s) {
// 重置光标位置
recharge_money.setSelection(selection_start_);
if (s != null) {
try {
// TODO Your things
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}
});