使用扩展函数将字符串中的每个单词大写

Capitalise every word in String with extension function

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

the quick brown fox

The Quick Brown Fox

我尝试使用 capitalize() 方法。那只是把 String 的第一个字母大写了。

既然您知道 capitalize(),您所需要做的就是用 space 作为分隔符拆分字符串以提取每个单词并将 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() }

可以用比接受的答案提供的更简单的方法来完成,检查这个:

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

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

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

可以这样称呼:

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

将显示:

This Is A Test.

我个人认为属性应该用于 returns 且不带参数。

另一种使用转换的方法:

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())
  }
}

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() }
    }
}