java/kotlin:总位数固定的double/int格式

hfyxw5xn  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(484)

我试着四处搜索,但我在找到这个问题的完整解决方案时遇到了问题:我想格式化一个 Int 所以总位数总是3。举几个例子:

1000000 -> 1,00m
678945 -> 678k
65432 -> 65,4k
5437 -> 5,43k

数字不应该低于1000或大于10亿,所以其他情况并不重要
这是我最接近的一次:

@JvmStatic
        fun formatPointsTop3(points: Int?): String {
            if (points == null) return ""

            val formatter = NumberFormat.getInstance(Locale.ITALIAN)
            val mathContext = MathContext(3, RoundingMode.DOWN)

            return when {
                points < 1000 -> {
                    "$points"
                }
                points < 1000000 -> {
                    val bigDecimal = BigDecimal(points / 1000.0, mathContext)
                    "${formatter.format(bigDecimal)}k"
                }
                else -> {
                    val bigDecimal = BigDecimal(points / 1000000.0, mathContext)
                    "${formatter.format(bigDecimal)}m"
                }
            }
        }

这适用于大多数情况,除了1000000输出1m(我想要100M)。添加 formatter.minimumFractionDigits = 2 给所有数字加小数。
有没有办法做到这一点,而不做奇怪的东西直接对字符串?

isr3a4wc

isr3a4wc1#

最后我做了这个:

fun formatPointsTop3(points: Int?): String {
            if (points == null) return ""
            if (points == 0) return "0"

            val maxNumberOfDigits = 3

            val multiplierExponent = log(points.toDouble(), 1000.0).toInt()

            val bigPoints = BigDecimal(points)
            val bigDivider = BigDecimal(1000).pow(multiplierExponent)
            val reducedPoints = bigPoints.divide(bigDivider)

            val intPart = reducedPoints.toBigInteger().toInt()
            val decimalPart = reducedPoints.subtract(BigDecimal(intPart)).toDouble()

            val numberOfDecimals = maxNumberOfDigits - (log10(intPart.toDouble()).toInt() + 1)

            var formattedString = "$intPart"

            if (numberOfDecimals > 0) {
                val multiplier = 10.0.pow(numberOfDecimals)
                val formatter = NumberFormat.getIntegerInstance()
                formatter.minimumIntegerDigits = numberOfDecimals
                formatter.maximumIntegerDigits = numberOfDecimals
                val multiplied = (decimalPart * multiplier).toInt()
                formattedString += ",${formatter.format(multiplied)}"
            }

            formattedString += when (multiplierExponent) {
                0 -> ""
                1 -> "k"
                2 -> "m"
                3 -> "b"
                else -> ""  //this is not possible as max int is 2 billions
            }

            return formattedString
        }

它很难看,但它看起来比字符串更好

7nbnzgx9

7nbnzgx92#

应该有。首先,弄清楚您想要如何呈现它,这就好像您对每个log(n)有不同的理解(例如,输入中有多少个数字)。对于7位数字,您希望呈现值除以一百万,并带有2个小数位数。对于8位数字,您需要值div million和1个分数,等等。这将是大量的代码,也许字符串操作更简单。

相关问题