Android EditText 保留指定位数小数

限制输入指定位数小数

重写 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))

你可能感兴趣的:(随手记,android,kotlin,开发语言)