EditText限制小数位长度
- 一、简述
-
-
- 使用方式
-
- 二、InputFilter
- 三、DigitFilter实现
一、简述
在日常开发中,经常会遇到限制用户小数位长度的输入,我们可以通过设置InputFilter的方式来实现。
使用方式
二、InputFilter
InputFilter是一个接口,需要实现一个方法:
/**
* 这个方法将会在使用[start,end)来替换[dstart,dend)时被调用
* 返回值是你最终想要添加的文本,若返回""则表示放弃此次改变,若返回null则应用此次改变
* 当发生删除操作时source的长度将会是0
* 不要直接修改dest的内容,它的内容只是用来查看的。
*/
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend);
方法参数代表的含义
name | type | mean |
---|---|---|
source | CharSequence | 将要改变的内容 |
start | int | source的起始位置,为0(暂时没有发现其它值的情况) |
end | int | source的结束位置,也就是source的长度 |
dest | Spanned | EditText中已经存在的内容 |
dstart | int | 插入点的位置 |
dend | int | 插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置 |
返回值说明
Return | mean |
---|---|
“” | 放弃此次改变,即不做任何更改 (删除操作除外) |
null | 应用本次改变,不做拦截 |
“abc” | 将指定的字符串添加到输入框中 |
三、DigitFilter实现
下面是实现的DigitFilter, 有什么疑问请留言
public class DigitFilter extends DigitsKeyListener {
private int digit;
public DigitFilter(int digit) {
this(true, true, digit);
}
/**
* @param sign 是否支持负数
* @param decimal 是否支持小数
* @param digit 小数位
*/
public DigitFilter(boolean sign, boolean decimal, int digit) {
super(sign, decimal);
this.digit = digit;
}
/**
* @param source 将要插入的字符串,来自键盘输入、粘贴
* @param start source的起始位置,为0(暂时没有发现其它值的情况)
* @param end source的长度
* @param dest EditText中已经存在的字符串
* @param dstart 插入点的位置
* @param dend 插入点的结束位置,一般情况下等于dstart;如果选中一段字符串(这段字符串将会被替换),dstart的值就插入点的结束位置
* @return
*/
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
//先通过DigitsKeyListener过滤掉数字之外的操作
CharSequence output = super.filter(source, start, end, dest, dstart, dend);
if (output != null) {
source = output;
}
//若source的长度为0并且dend>dstart则认为是删除操作
if (source.length() == 0 && dend > dstart) {
//若小数点前只有一位则不能删除
if (dstart == 0) {
if (dest.toString().indexOf(".") == 1) {
return dest.subSequence(dstart, dend);
}
}
}
//首位添加.的时候自动补零
if (source.toString().equals(".") && dstart == 0) {
return "0.";
}
//若首位是0,后面不能添加.之外的数字
if (dest.toString().equals("0") && !source.toString().equals(".")) {
return "";
}
int length = dest.toString().length();
int pointIndex=0;
//若小数位长度大于限制位数则放弃更改
for (int i = 0; i < length; i++) {
if (dest.charAt(i) == '.') {
pointIndex=i;
}
}
if (pointIndex!=0&&dend>pointIndex){
if (length-pointIndex>digit){
return "";
}
}
return source;
}
}