使用kotlin添加逗号或每3位数字加一点



我想在EditText输入中每3位添加逗号或点。

示例:

  • 输入:1000。输出:1.000
  • 输入:11000。输出:11.000

如果您在JVM上,您可以使用

"%,d".format(input)

其对于输入CCD_ 2给出CCD_。将,替换为所需的任何分隔符。

如果您想使用预定义的数字格式,例如针对当前区域设置,请使用:

java.text.NumberFormat.getIntegerInstance().format(input);

还要确保检查其他格式实例,例如getCurrencyInstancegetPercentInstance。请注意,您也可以将NumberFormat与其他区域设置一起使用。只需将它们传递给get*Instance-方法即可。

第二种变体也可以在这里找到:将Integer转换为带逗号的字符串,表示数千

如果你通过Javascript使用它,你可能会感兴趣:我如何使用Javascript格式化数字?

基于上面的Splitframe答案,做了一个简化版本(没有var(:

fun Int.formatDecimalSeparator(): String {
return toString()
.reversed()
.chunked(3)
.joinToString(",")
.reversed()
}

并添加了一些测试:

@Test
fun whenFormatDecimal_thenReturnFormatted() {
mapOf(
1 to "1",
12 to "12",
123 to "123",
1234 to "1,234",
12345 to "12,345",
123456 to "123,456",
1234567 to "1,234,567",
12345678 to "12,345,678",
123456789 to "123,456,789",
1234567890 to "1,234,567,890",
).forEach { (test, expected) ->
val result = test.formatDecimalSeparator()
assertEquals(expected, result)
}
}

在我的例子中是一个KMM项目,我们不支持其他语言,所以它完成了任务。我想说的一个更好的解决方案是创建一个expectUtil类,每个平台在考虑用户Locale等的情况下实现格式化程序。

这是一种简单的方法,可以用任何字符替换默认分隔符:

val myNumber = NumberFormat.getNumberInstance(Locale.US)
.format(123456789)
.replace(",", "،")

System.out.println(NumberFormat.getNumberInstance(Locale.US(.format(35634646((;

我将其用于非JVM Kotlin环境:

fun formatDecimalSeperators(number :String) :String {
var index = 1
return number
.takeIf { it.length > 3 }
?.reversed()
?.map { if (index++ % 3 == 0) "$it," else it }
?.joinToString("")
?.reversed()
?.removePrefix(",")
?: number
}

您也可以在Android字符串资源中使用@Roland answer来格式化它:

<string name="answer_count">%,01d answers</string>

这可能有助于

fun format(amount):String{
val numberFormat = DecimalFormat("#,###.00")
return numberFormat.format(amount)
}

这里有一个扩展函数可以处理您的案例,也可以处理

  • 十进制位置

  • 语言考虑

  • 地板

    fun Number.toFormattedNumber(significantDecimalPlaces: Int = 2): String? 
    {
    val df = DecimalFormat(
    "#,###."+"#".repeat(significantDecimalPlaces),
    DecimalFormatSymbols(Locale.ENGLISH)
    )
    df.roundingMode = RoundingMode.FLOOR
    return try {
    df.format(this.toDouble())
    }catch (e: Exception){
    null
    }
    }
    

这是的其他解决方案

fun separateDigit(text: String): String {
var reversedText = text.reversed()
var formattedText = ""
while (reversedText.length > 3) {
formattedText += "${reversedText.take(3)},"
reversedText = reversedText.drop(3)
}
formattedText += reversedText
return "${formattedText.reversed()}"
}

对于一个没有获取Locale的方法,您可以使用扩展将Int转换为如下格式的String:

fun Int.formatWithThousandComma(): String {
val result = StringBuilder()
val size = this.toString().length
return if (size > 3) {
for (i in size - 1 downTo 0) {
result.insert(0, this.toString()[i])
if ((i != size - 1) && i != 0 && (size - i) % 3 == 0)
result.insert(0, "'")
}
result.toString()
} else
this.toString()
}

相关内容

最新更新