看过一篇文章,我加了在正负浮点型情况下,第一位输入正负,第二位不能输入小数点的状况
想发转载,找不到原文,先发出来,侵权必删。
1.在layout文件EditText下加入
android:inputType="numberSigned|numberDecimal"
2.新建类,具体代码如下:
import android.text.InputFilter;
import android.text.Spanned;
/**
* 限制输入小数的位数及小数点后位数
* 开头结尾不能输入.
* 在第一位输入+或-时,第二位不能输入.
*/
public class DecimalDigitsInputFilter implements InputFilter {
/**
* 限制小数位数
*/
private final int decimalDigits;
public DecimalDigitsInputFilter(int decimalDigits) {
this.decimalDigits = decimalDigits;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
int dotPos = -1;
//dotpos1监视正负号是否打出
int dotPos1 = -1;
int len = dest.length();
//从数字第一位锁定小数点的位置索引
for (int i = 0; i < len; i++) {
char c = dest.charAt(i);
if(c == '+' || c == '-'){
dotPos1=0;
}
if (c == '.' || c == ',') {
dotPos = i;
break;
}
}
//使得数字第一个打出".",则数字第一位与最后一位索引都为0
//即.***格式数字打不出来
if(source.equals(".") && dstart==0&&dend==0){
return "";
}
//使得数字第一个打出"+"或者“-”,第二位打不出“.”
//即+.***或者-.***格式数字打不出来
if(dotPos1==0&&source.equals(".")&&dstart==1&&dend==1){
return "";
}
if (dotPos >= 0) {
// protects against many dots
//存在小数点,不能再次打出小数点
if (source.equals(".") || source.equals(",")) {
return "";
}
// if the text is entered before the dot
//若限制小数位数为12,则dend最大为11
//若小数已经打到12位并不包含小数点,即最后一个数字索引为11
//若小数已经打到12位,最后是一个小数点,索引为11
//也就是限制12位数字当全是数字,dotpos=-1,不执行if
// 或者最后一位是小数点时候,doypos=11,dend=11,执行if
//则不能再键任何符号数字等
if (dend <= dotPos) {
return null;
}
//限制小数位数
//数字总长-小数点索引,如120.0654
//len=8,dotpos=3,len-dotpos=5,decimalDigits代表小数位数
//使其为4,则小数点个数必须小于等于4,不是,则返回空
if (len - dotPos > decimalDigits) {
return "";
}
}
return null;
}
}
3.设置保留三位小数,总长12位
edit2_6.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(3),new InputFilter.LengthFilter(12)});