有趣的价格精度处理规则代码

66 阅读1分钟

价格精度处理规则如下:

  • 如果整数位数≤ 6 位,则整数位+小数位要小于等于 7 位,超过 7 位的从第 8 位开始直接抹去,抹去后将结尾剩余的 0 省略,例如

    • 123.123435115=123.1234
    • 123456.12345=123456.1
    • 123.1200456=123.12
  • 如果整数位>6 位,则仅展示整数位,例如

    • 1234567.12634=1234567
  • 如果整数位等于 0, 小数位从十分位开始(包括 10 分位)到第一个不为零的数,如果有 4 个以下连续的 0,则小数位最大保留 6 位精度,第 7 位直接抹去,抹去后将结尾剩余的 0 省略,例如

    • 0.00012345=0.000123
    • 0.00123045=0.00123
  • 如果整数位是 0, 小数位从十分位开始(包括 10 分位)到第一个不为零的数,如果有 大于等于 4 个连续的 0,则需要将这些 0 折叠展示为 0{连续 0 的数量},再至多展示后面 4 位数,第 5 位直接抹去,抹去后将结尾剩余的 0 省略,例如

    • 0.000012345=0.0{4}1234
    • 0.00000120034=0.0{5}12

实现代码如下:

fun String.formatPrice(): String {
    var result = this
    try {
        if (this.contains(".")) {
            val array = this.split(".")
            if (array[0].length > 6) {
                result = array[0]
            } else {
                if (array[0] == "0") {
                    var count = 0
                    var isOver = false
                    array[1].forEach {
                        if (it == '0') {
                            if (!isOver) count += 1
                        } else {
                            isOver = true
                        }
                    }
                    val numbers = if (count < 4) {
                        try {
                            array[1].substring(0, 6)
                        } catch (e: Exception) {
                            e.printStackTrace()
                            array[1]
                        }
                    } else {
                        try {
                            "0{$count}".plus(array[1].substring(count, count + 4))
                        } catch (e: Exception) {
                            e.printStackTrace()
                            "0{$count}".plus(array[1].substring(count))
                        }
                    }
                    result = array[0].plus(".$numbers")
                } else {
                    if (this.length > 7) {
                        result = this.substring(0, 8)
                    }
                }
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return result
}

期待各位提供不同的解法