28

我想在 Kotlin 中做一个扩展函数,将字符串中每个单词的第一个字母转换为大写

the quick brown fox

The Quick Brown Fox

我尝试使用该capitalize()方法。这只是将 . 的第一个字母大写String

4

5 回答 5

92

既然你知道capitalize()你所需要的就是用空格分割字符串作为分隔符来提取每个单词并应用于capitalize()每个单词。然后重新加入所有的单词。

fun String.capitalizeWords(): String = split(" ").map { it.capitalize() }.joinToString(" ")

用它:

val s = "the quick brown fox"
println(s.capitalizeWords())

将打印:

The Quick Brown Fox

注意:此扩展不考虑单词中可能大写或不大写的其他字符,但这确实:

fun String.capitalizeWords(): String = split(" ").map { it.toLowerCase().capitalize() }.joinToString(" ")

或更短:

@SuppressLint("DefaultLocale")
fun String.capitalizeWords(): String =
    split(" ").joinToString(" ") { it.toLowerCase().capitalize() }
于 2018-08-27T21:39:07.380 回答
24

它可以以比接受的答案提供的更简单的方式完成,请检查:

fun String.capitalizeWords(): String = split(" ").joinToString(" ") { it.capitalize() }
于 2019-06-12T19:09:28.110 回答
6

为什么不使用扩展属性呢?

val String.capitalizeWords
    get() = this.toLowerCase().split(" ").joinToString(" ") { it.capitalize() }

可以这样称呼:

val test = "THIS iS a TeST."
println(test.capitalizeWords)

这将显示:

This Is A Test.

我个人认为属性应该用于不带参数的返回。

于 2020-08-08T06:09:44.087 回答
3

capitalise() 现在已弃用,kotlin 建议使用 replaceFirstChar 代替

fun camelCase(string: String, delimiter: String = " ", separator: String = " "): String {
    return string.split(delimiter).joinToString(separator = separator) {
        it.lowercase().replaceFirstChar { char -> char.titlecase() }
    }
}
于 2021-07-29T11:43:22.203 回答
0

您可以通过转换来做到这一点的另一种方法:

fun String.capitalizeWords() = split(' ').joinToString(" ", transform = String::capitalize)

并对其进行测试:

class StringExtensionTest {
  @Test
  fun `test capitalize a sentance`() = run {
    Assert.assertEquals("Abba Sill Med Extra", "abba sill med extra".capitalizeWords())
  }
}
于 2021-06-14T14:41:40.347 回答