diff --git a/libraries/stdlib/src/kotlin/Char.kt b/libraries/stdlib/src/kotlin/Char.kt index ba39b85ad60..de43e12b254 100644 --- a/libraries/stdlib/src/kotlin/Char.kt +++ b/libraries/stdlib/src/kotlin/Char.kt @@ -25,3 +25,12 @@ public inline fun Char.isJavaLetterOrDigit(): Boolean = Character.isJavaLetterOr */ public inline fun Char.isWhitespace(): Boolean = Character.isWhitespace(this) +/** + * Returns true if this character is upper case + */ +public inline fun Char.isUpperCase(): Boolean = Character.isUpperCase(this) + +/** + * Returns true if this character is lower case + */ +public inline fun Char.isLowerCase(): Boolean = Character.isLowerCase(this) diff --git a/libraries/stdlib/src/kotlin/Strings.kt b/libraries/stdlib/src/kotlin/Strings.kt index 901289a101a..d2bc90663e4 100644 --- a/libraries/stdlib/src/kotlin/Strings.kt +++ b/libraries/stdlib/src/kotlin/Strings.kt @@ -35,6 +35,24 @@ public inline fun String.trimLeading(prefix: String): String { return answer } +/** + * Returns a copy of this string capitalised if it is not empty or already starting with an uppper case letter, otherwise returns this + * + * @includeFunctionBody ../../test/StringTest.kt capitalize + */ +public inline fun String.capitalize(): String { + return if (notEmpty() && charAt(0).isLowerCase()) substring(0, 1).toUpperCase() + substring(1) else this +} + +/** + * Returns a copy of this string with the first letter lower case if it is not empty or already starting with a lower case letter, otherwise returns this + * + * @includeFunctionBody ../../test/StringTest.kt decapitalize + */ +public inline fun String.decapitalize(): String { + return if (notEmpty() && charAt(0).isUpperCase()) substring(0, 1).toLowerCase() + substring(1) else this +} + /** Returns the string with the trailing postfix of this string removed */ public inline fun String.trimTrailing(postfix: String): String { var answer = this diff --git a/libraries/stdlib/test/StringTest.kt b/libraries/stdlib/test/StringTest.kt index f2db543a24c..71895a05302 100644 --- a/libraries/stdlib/test/StringTest.kt +++ b/libraries/stdlib/test/StringTest.kt @@ -78,4 +78,19 @@ class StringTest { assertFalse("".endsWith('a')) } + test fun capitalize() { + assertEquals("A", "A".capitalize()) + assertEquals("A", "a".capitalize()) + assertEquals("Abcd", "abcd".capitalize()) + assertEquals("Abcd", "Abcd".capitalize()) + } + + test fun decapitalize() { + assertEquals("a", "A".decapitalize()) + assertEquals("a", "a".decapitalize()) + assertEquals("abcd", "abcd".decapitalize()) + assertEquals("abcd", "Abcd".decapitalize()) + assertEquals("uRL", "URL".decapitalize()) + } + }