使用Kotlin字符串函数/字符串格式添加空格

6

这可能已经被问过几次了.. 我想做的是在字符串(8888319024981442)的每四个字符之间添加空格,我的字符串长度恰好为16。使用 String.format 并不有帮助。

避免使用split或创建多个字符串占用内存。

是否有任何可以快速使用的kotlin函数/String.format呢?

2个回答

14

我认为没有非常简单的方法来做到这一点,但有一种传统的方法:

val number = "8888319024981442"
val list = mutableListOf<String>()
for (i in 0..3) { list.add(number.substring(i*4, (i+1)*4))}
println(list.joinToString(" "))

编辑

或者 @IR42 的简单回答

number.chunked(4).joinToString(separator = " ")

4
number 按照每四个数字一组进行分块,然后用空格作为分隔符将这些分块的数字转换成字符串。具体实现代码为:number.chunked(4).joinToString(separator = " ") - IR42
我认为你的第一个方法创建了一个临时的 ArrayList,一个 IntRange 和四个子 String ,除了必要的 StringBuilder 和结果 String 外。 - gidds
2
对于不包含4的倍数的数字,最好使用number.reversed().chunked(4).joinToString(" ").reversed()。它会显示"123 4567"而不是错误的"1234 567"。 - sagus_helgy

1

我认为没有一个既简单又优雅的答案,同时避免所有临时对象。

对于前者,IR42使用chunked()可能是最好的选择。

以下是对后者的尝试:

val number = "8888319024981442"
val result = buildString {
    for (i in 0 until number.length) {
        if (i % 4 == 0 && i > 0)
            append(' ')
        append(number[i])
    }
}
println(result) // '8888 3190 2498 1442'

这将仅创建一个StringBuilder对象,然后从中创建一个单一的String对象 - 这是可能的最小化。虽然有点丑陋而冗长,但如果避免所有临时对象确实很重要,则这可能是你所能做的最好的选择。
(* 或者至少是在给定条件下可能的最小值。为了获得更好的性能,请考虑传递StringBuilder本身而不创建它的String版本。更好的方法是使用现有的StringBuilder,而不是完全创建一个新的。但当然,所有这些都需要对周围代码进行更改。)
(** 尽管有一些情况下这确实非常重要,但在实践中它们相当罕见。我建议您使用简单版本,直到进行了一些分析并证明这是瓶颈,并且在您的情况下复杂版本确实表现更好。即使如此,也要将其折叠成实用程序函数以保持主要代码清晰。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接