今天回头看了看昨天的代码,才发现上篇总结的很不到位,存在很多bug,在这里稍微补充一下,
来个加强版本
上篇的不足之处:
1 未做小数相关的逻辑编写
2 没有考虑到输入非法字符时的情况
完善后写成了一个工具类,更加方便调用与代码的规范
效果图:

首先判断是否允许输入数字包含小数类型,在此要限制EditText可接收的内容
<span style="font-family:Comic Sans MS;font-size:18px;"> mEditText.setKeyListener(new NumberKeyListener() {
@Override
protected char[] getAcceptedChars() {
if(isPoint){
return new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0','.'};
}
return new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
}
@Override
public int getInputType() {
return InputType.TYPE_CLASS_NUMBER;
}
});</span>
虽然限制了EditText可接收的内容,但当有非法字符输入时仍要做一定的判断,当输入除了0~9或者小数点以外的字符,都表示用户点击了非法字符.
通过用户新输入的字符和文本框之前的字符来限制只能输入一个小数点,并限制小数的位数
<span style="font-family:Comic Sans MS;font-size:18px;">if(oldStr.contains(".")){
//只能输入一个小数点
if (newStr.contains(".")) {
return "";
}
//以小数点为界分割字符串
String[] splitArray = oldStr.split("\\.");
if (splitArray.length > 1) {
//得到小数点后的字符串
String dotValue = splitArray[1];
if (dotValue.length() == POINT_LENGHT) {
return "";
}
}
}</span>
当输入字符长度大于2且没有非法字符和小数位时进行格式化金额操作
<span style="font-family:Comic Sans MS;font-size:18px;">//格式化金额,三位一断
if (oldStr!=null && oldStr.length() > 2
&& !oldStr.contains(".") && !oldStr.contains(",")) {
String newValue = oldStr + source;
String amountStr = format.format(Double.parseDouble(newValue));
mEditText.setText("");
mEditText.setText(amountStr);
mEditText.setSelection(amountStr.length());
return amountStr;
} </span>
详细代码连接:http://download.csdn.net/detail/huiling815/9623118