From b28eea45cc301400074b8b74b148a98daa59c219 Mon Sep 17 00:00:00 2001 From: Paramvir Singh Date: Mon, 19 Jun 2023 19:04:54 -0400 Subject: [PATCH 1/2] check conditions added to capitalizeFirstChar --- .../strings/StringsExtensions.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt index bd0138e..87382e5 100644 --- a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt +++ b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt @@ -52,16 +52,24 @@ inline fun String.replace(ignoreCase: Boolean = false, vararg vars: Pair d.replaceRange(0, 1, d.first().uppercaseChar().toString()) } +} + /** * Removes non-numerical characters from a string. */ From 00eaad39a6ec7d630b2e143a3d7d3b74953a6794 Mon Sep 17 00:00:00 2001 From: Paramvir Singh Date: Wed, 19 Jul 2023 16:44:19 -0400 Subject: [PATCH 2/2] String.capitalizeFirstChar takes in multiple and single spaces and thorws exception for illegal string --- .../strings/StringsExtensions.kt | 17 +++++----- .../strings/StringsExtensionsKtTest.kt | 33 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt index 6ade3aa..8b9f9ec 100644 --- a/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt +++ b/src/main/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensions.kt @@ -6,6 +6,7 @@ import com.cesarferreira.pluralize.pluralize import com.cesarferreira.pluralize.singularize import com.google.common.base.Strings import me.carleslc.kotlinextensions.standard.letOrElse +import java.lang.IllegalArgumentException import java.util.* inline infix operator fun String.times(n: Int): String = Strings.repeat(this, n) @@ -51,18 +52,18 @@ inline fun String.remove(substring: String) = replace(substring, "") /** * Capitalized the first character of every word where word is delimited by a space character. */ -fun String.capitalizeFirstChar(): String { +fun String.capitalizeFirstChar(saveSpacing: Boolean = true): String { - // to avoid repeated trimming - val inputTrimmed = this.trim() + if (isEmpty() || isBlank()) throw IllegalArgumentException("Blank or empty String cannot be used.") - if (inputTrimmed.isBlank() || inputTrimmed.isEmpty()) return this + val deliminator = if (saveSpacing) " " else " +" - return inputTrimmed + return this .lowercase(Locale.getDefault()) - .split(" ") - .joinToString(" ", "") { d -> - d.replaceRange(0, 1, d.first().uppercaseChar().toString()) + .split(deliminator.toRegex()) + .joinToString(" ") { + if (it.isEmpty()) it + else it.replaceRange(0, 1, it.first().uppercaseChar().toString()) } } diff --git a/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt b/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt index 172c266..11ea48a 100644 --- a/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt +++ b/src/test/kotlin/me/carleslc/kotlinextensions/strings/StringsExtensionsKtTest.kt @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test import strings.* +import java.lang.IllegalArgumentException import java.util.* class StringsExtensionsKtTest { @@ -189,17 +190,27 @@ class StringsExtensionsKtTest { @Test fun capitalizeFirstCharTest() { - val expected = "Petro Canada" - - val result1 = "petro canada".capitalizeFirstChar() - val result2 = "PETRO CANADA".capitalizeFirstChar() - val result3 = "PEtRO CAnaDA".capitalizeFirstChar() - val result4 = "pEtRO cAnaDA".capitalizeFirstChar() - - Assertions.assertEquals(expected, result1) - Assertions.assertEquals(expected, result2) - Assertions.assertEquals(expected, result3) - Assertions.assertEquals(expected, result4) + val result1 = "aa bb cc dd".capitalizeFirstChar() + val result2 = "aa bb cc dd".capitalizeFirstChar() + val result3 = " aa bb ".capitalizeFirstChar() + val result4 = " aa bb ".capitalizeFirstChar() + val result5 = "aa bb cc dd".capitalizeFirstChar(false) + val result6 = "aa bb cc dd".capitalizeFirstChar(false) + val result7 = " aa bb ".capitalizeFirstChar(false) + val result8 = " aa bb ".capitalizeFirstChar(false) + + Assertions.assertEquals("Aa Bb Cc Dd", result1) + Assertions.assertEquals("Aa Bb Cc Dd", result2) + Assertions.assertEquals(" Aa Bb ", result3) + Assertions.assertEquals(" Aa Bb ", result4) + Assertions.assertEquals("Aa Bb Cc Dd", result5) + Assertions.assertEquals("Aa Bb Cc Dd", result6) + Assertions.assertEquals(" Aa Bb ", result7) + Assertions.assertEquals(" Aa Bb ", result8) + + Assertions.assertThrows(IllegalArgumentException::class.java) { "".capitalizeFirstChar() } + Assertions.assertThrows(IllegalArgumentException::class.java) { " ".capitalizeFirstChar() } + Assertions.assertThrows(IllegalArgumentException::class.java) { " ".capitalizeFirstChar() } }