限制输入指定位数小数
重写 InputFilter 控制器
/**
* 小数点位数限制
* @pointLength 保留小数位数
*/
class DecimalPointUtil(private val pointLength: Int) : InputFilter {
/**
* @param source 输入的文字
* @param start 输入-0,删除-0
* @param end 输入-文字的长度,删除-0
* @param dest 原先显示的内容
* @param dstart 输入-原光标位置,删除-光标删除结束位置
* @param dend 输入-原光标位置,删除-光标删除开始位置
* @return 需要变化的内容
*/
override fun filter(
source: CharSequence, start: Int, end: Int,
dest: Spanned, dstart: Int, dend: Int
): CharSequence {
val start1 = dest.subSequence(0, dstart)//删除后的内容前半截
val end1 = dest.subSequence(dend, dest.length)//删除后的内容后半截
val target = start1.toString().plus(source).plus(end1) //前半截 + 新内容 + 后半截 = 新字符串
val backup = dest.subSequence(dstart, dend) // 需要变化的内容
if (target.indexOf(".") == 0) return backup //小数点在第一位 直接返回原值
if (target.startsWith("0") && !target.startsWith("0.") && "0" != target) return backup //如果新字符串 开始位置是 0 且不是 0. 且新字符串不是0 则返回 原值
val index = target.indexOf(".")
if (index >= 0 && index + pointLength + 1 < target.length) return backup //有小数点,且实际长度大于理论长度(理论长度 = 小数点位置 + 1 + 保留位数 ) 返回原字符串不做处理
return source
}
}
使用方式
//设置限制输入浮点数
editText.inputType = TYPE_CLASS_NUMBER or TYPE_NUMBER_FLAG_DECIMAL
//设置限制输入3位小数
editText.filters = arrayOf(DecimalPointUtil(3))