通过构造方法传入小数点后面的位数,如果调用方法为:
edittext.setLongClickable(false); //禁用粘贴
edittext.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(2)});//限定两位小数
public class DecimalDigitsInputFilter implements InputFilter {
private final int decimalDigits;
/**
* Constructor.
* 用于设置edittext的小数位数
* @param decimalDigits maximum decimal digits
*/
public DecimalDigitsInputFilter(int decimalDigits) {
this.decimalDigits = decimalDigits;
}
/**
*
* @param source 即将输入的字符串
* @param start source的开始
* @param end source的结束
* @param dest 已经有的内容
* @param dstart 要替换或者添加的起始位置,即光标所在的位置
* @param dend 要替换或者添加的终止始位置,若为选择一串字符串进行更改,则为选中字符串 最后一个字符在dest中的位置
* @return 返回null表示全部替换位置上的字符,也就是全部输入
*/
@Override
public CharSequence filter(CharSequence source,int start,int end, Spanned dest,int dstart, int dend) {
String reg="^[0-9|.]*$";
if (!source.toString().matches(reg)){
return "";
}
int dotPos = -1;
int len = dest.length();
for (int i = 0; i < len; i++) {
char c = dest.charAt(i);
if (c == '.' || c == ',') {
dotPos = i;
break;
}
}
//之前没有小数点,要在第一位添加小数点,而且添加位置后面没有指定位以上字符,添加0.
if(dotPos<0&&(source.equals(".")||source.equals(","))&&dstart ==0&&len-dend<=decimalDigits){
return "0.";
}
//添加小数点的后面有指定位数以上数字,不添加字符
if((source.equals(".")||source.equals(","))&&len-dend>decimalDigits){
return "";
}
if (dotPos >= 0) {//已经包含小数点
if (source.equals(".") || source.equals(","))//新输入的内容为小数点
{
return "";//已经有小数点,不添加小数点了返回空的
}
// 小数点之前添加则正常添加字符
if (dend <= dotPos) {
return null;
}
if (len - dotPos > decimalDigits) {//小数点后面的位数大于指定的位数则返回空的
return "";
}
}
return null;
}
}
原文:https://blog.youkuaiyun.com/laotou_xiaobai/article/details/81900934