美文网首页
(android)EditText输入金额注意事项

(android)EditText输入金额注意事项

作者: 初见soulmate | 来源:发表于2018-05-04 10:56 被阅读0次

    在开发中有时候会遇到输入金额的情况,对于金额的显示需要注意比较多的情况,
    例如:

    • 金额不能以0开头
    • 不能有多个小数点
    • 小数点后面只保留2位数
    • 金额较大的时候做分号分割等等

    如果还涉及到部分计算,也得注意计算结果是否正确等等情况

    因为项目里面涉及到,目前也使用稳定,所以将相关代码分享出来,自己也再熟悉一遍。

    以下是相关代码:

    edit_money?.addTextChangedListener(object : TextWatcher {
                override fun afterTextChanged(s: Editable?) {
                }
    
                override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                }
    
                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                    var str = edit_money?.text?.toString()!!.trim()
                    //用于处理多个小数点输入问题
                    if (!TextUtils.isEmpty(str) && str.indexOf(".") != str.lastIndexOf(".")) {
                        edit_money?.setText(lastInput)
                        edit_money?.setSelection(edit_money?.text!!.length)//将光标移至文字末尾
                        return
                    }
                    //控制输入时只能输入1个0
                    if (!TextUtils.isEmpty(str) && str == "00") {
                        edit_money?.setText("0")
                        edit_money?.setSelection(edit_money?.text!!.length)//将光标移至文字末尾
                        return
                    }
                    //控制输入时第一个为0第二位不为.的情况
                    if (!TextUtils.isEmpty(str) && str.length >= 2 && str.indexOf("0") == 0 && str.indexOf(".") != 1) {
                        edit_money?.setText(str.substring(1, str.length))
                        edit_money?.setSelection(edit_money?.text!!.length)//将光标移至文字末尾
                        return
                    }
                    lastInput = str
                    //用于处理限制输入小数点后2位问题
                    val index = edit_money?.text?.indexOf(".")
                    if (index!! > 0 && index < edit_money?.text?.length!! - 3) {
                        val str = edit_money?.text?.substring(0, edit_money?.text?.toString()?.trim()?.indexOf(".")!! + 3)
                        edit_money?.setText(str)
                        edit_money?.setSelection(edit_money?.text!!.length)//将光标移至文字末尾
                    }
                    if (index == 0) {
                        edit_money?.setText("0" + edit_money?.text!!)
                        edit_money?.setSelection(edit_money?.text!!.length)//将光标移至文字末尾
                    }
                    var pricestr = edit_money?.text.toString().trim()
                    if (!TextUtils.isEmpty(pricestr)) {
                        //todo 获取到价格之后的处理
                    } else {
                        //todo 没有相关输入的处理
                    }
                }
            })
    

    关于相关金额计算的问题,由于代码本身的问题,一些计算是不正确的,跟结果会有一定偏差,所以对于计算使用了以下工具类处理:

    
    import java.math.BigDecimal
    import java.math.RoundingMode
    
    /**
     * 用于double类型直接计算,以保证精度正确
     *
     * @author 陈聪 2018-01-30 11:55
     */
    object CalcUtils {
        val TYPE_ADD = 0x00 // 加法
        val TYPE_MULTIPLY = 0x01 // 乘法
        val TYPE_DIVIDE = 0x02 // 除法
        val TYPE_SUBTRACT = 0x03 // 减法
        /**
         * 加法
         * @param a
         * @param b
         * @return
         */
        fun add(a: Double?, b: Double?): Double? {
            return calc(a, b, -1, TYPE_ADD, null)
        }
    
        /**
         * 减法
         * @param a
         * @param b
         * @return
         */
    
        fun sub(a: Double?, b: Double?): Double? {
            return calc(a, b, -1, TYPE_SUBTRACT, null)
        }
    
        /**
         * 乘法
         * @param a
         * @param b
         * @return
         */
    
        fun multiply(a: Double?, b: Double?): Double? {
            return calc(a, b, -1, TYPE_MULTIPLY, null)
        }
    
        /**
         * 除法
         * @param a
         * @param b
         * @return
         */
    
        fun divide(a: Double?, b: Double?): Double? {
            return calc(a, b, -1, TYPE_DIVIDE, null)
        }
    
        /**
         * 乘法
         * @param a
         * @param b
         * @param scale 小数点后保留的位数
         * @param mode 保留的模式
         * @return
         */
        fun multiply(a: Double?, b: Double?, scale: Int, mode: RoundingMode): Double? {
    
            return calc(a, b, scale, TYPE_MULTIPLY, mode)
        }
    
        /**
         * 除法
         * @param a
         * @param b
         * @param scale 小数点后保留的位数
         * @param mode 保留的模式
         * @return
         */
        fun divide(a: Double?, b: Double?, scale: Int, mode: RoundingMode): Double? {
    
            return calc(a, b, scale, TYPE_DIVIDE, mode)
        }
    
        /**
         * 计算
         * @param a
         * @param b
         * @param scale
         * @param type
         * @param mode
         * @return
         */
        private fun calc(a: Double?, b: Double?, scale: Int, type: Int, mode: RoundingMode?): Double? {
            var result: BigDecimal? = null
    
            val bgA = BigDecimal(a.toString())
            val bgB = BigDecimal(b.toString())
            when (type) {
                TYPE_ADD -> result = bgA.add(bgB)
                TYPE_MULTIPLY -> result = bgA.multiply(bgB)
                TYPE_DIVIDE -> try {
                    result = bgA.divide(bgB)
                } catch (e: Exception) {// 防止无限循环而报错  采用四舍五入保留3位有效数字
                    result = bgA.divide(bgB, 3, RoundingMode.HALF_DOWN)
                }
    
                TYPE_SUBTRACT -> result = bgA.subtract(bgB)
            }
            if (mode == null) {
                if (scale != -1) {
    
                    result = result!!.setScale(scale)
                }
            } else {
                if (scale != -1) {
                    result = result!!.setScale(scale, mode)
                }
            }
            return result!!.toDouble()
        }
    }
    

    相关代码使用的是kotlin,若有看不懂的可以联系我。
    QQ:617909447
    若想学习kotlin的可以加以下QQ群:329673958

    相关文章

      网友评论

          本文标题:(android)EditText输入金额注意事项

          本文链接:https://www.haomeiwen.com/subject/fsxdrftx.html