From 5d589d37d41a924b69b22805d7ac9051a2da399e Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Wed, 20 Jun 2018 22:57:14 +0200 Subject: [PATCH 1/2] convert string to tiltle case --- core-java/pom.xml | 6 ++ .../baeldung/string/TitleCaseConverter.java | 68 ++++++++++++++++++ .../string/TitleCaseConverterTest.java | 70 +++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java create mode 100644 core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java diff --git a/core-java/pom.xml b/core-java/pom.xml index f7a2139d99..8e863cec40 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -203,6 +203,11 @@ mail 1.5.0-b01 + + com.ibm.icu + icu4j + ${icu4j.version} + @@ -471,6 +476,7 @@ 3.0.0-M1 1.6.0 1.5.0-b01 + 61.1 \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java b/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java new file mode 100644 index 0000000000..e72ce44eda --- /dev/null +++ b/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java @@ -0,0 +1,68 @@ +package com.baeldung.string; + +import com.ibm.icu.lang.UCharacter; +import com.ibm.icu.text.BreakIterator; +import org.apache.commons.lang.WordUtils; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class TitleCaseConverter { + + private static final String WORD_SEPARATOR = " "; + + public static String convertToTitleCaseIteratingChars(String text) { + if (text == null || text.isEmpty()) { + return text; + } + + StringBuilder converted = new StringBuilder(); + + boolean convertNext = true; + for (char ch : text.toCharArray()) { + if (Character.isSpaceChar(ch)) { + convertNext = true; + } else if (convertNext) { + ch = Character.toTitleCase(ch); + convertNext = false; + } else { + ch = Character.toLowerCase(ch); + } + converted.append(ch); + } + + return converted.toString(); + } + + public static String convertToTitleCaseSplitting(String text) { + if (text == null || text.isEmpty()) { + return text; + } + + return Arrays + .stream(text.split(WORD_SEPARATOR)) + .map(word -> word.isEmpty() + ? word + : Character.toTitleCase(word.charAt(0)) + word + .substring(1) + .toLowerCase()) + .collect(Collectors.joining(WORD_SEPARATOR)); + } + + public static String convertToTitleCaseIcu4j(String text) { + if (text == null || text.isEmpty()) { + return text; + } + + return UCharacter.toTitleCase(text, null); + } + + public static String convertToTileCaseWordUtilsFull(String text) { + return WordUtils.capitalizeFully(text); + } + + public static String convertToTileCaseWordUtils(String text) { + return WordUtils.capitalize(text); + } + +} diff --git a/core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java b/core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java new file mode 100644 index 0000000000..2da1c89795 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java @@ -0,0 +1,70 @@ +package com.baeldung.string; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class TitleCaseConverterTest { + + private static final String TEXT = "tHis IS a tiTLe"; + private static final String TEXT_EXPECTED = "This Is A Title"; + private static final String TEXT_EXPECTED_NOT_FULL = "THis IS A TiTLe"; + + private static final String TEXT_OTHER_DELIMITERS = "tHis, IS a tiTLe"; + private static final String TEXT_EXPECTED_OTHER_DELIMITERS = "This, Is A Title"; + private static final String TEXT_EXPECTED_OTHER_DELIMITERS_NOT_FULL = "THis, IS A TiTLe"; + + @Test + public void whenConvertingToTitleCaseIterating_thenStringConverted() { + assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseIteratingChars(TEXT)); + } + + @Test + public void whenConvertingToTitleCaseSplitting_thenStringConverted() { + assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseSplitting(TEXT)); + } + + @Test + public void whenConvertingToTitleCaseUsingWordUtilsFull_thenStringConverted() { + assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTileCaseWordUtilsFull(TEXT)); + } + + @Test + public void whenConvertingToTitleCaseUsingWordUtils_thenStringConvertedOnlyFirstCharacter() { + assertEquals(TEXT_EXPECTED_NOT_FULL, TitleCaseConverter.convertToTileCaseWordUtils(TEXT)); + } + + @Test + public void whenConvertingToTitleCaseUsingIcu4j_thenStringConverted() { + assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseIcu4j(TEXT)); + } + + @Test + public void whenConvertingToTitleCaseWithDifferentDelimiters_thenDelimitersKept() { + assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseIteratingChars(TEXT_OTHER_DELIMITERS)); + assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseSplitting(TEXT_OTHER_DELIMITERS)); + assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTileCaseWordUtilsFull(TEXT_OTHER_DELIMITERS)); + assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS_NOT_FULL, TitleCaseConverter.convertToTileCaseWordUtils(TEXT_OTHER_DELIMITERS)); + assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseIcu4j(TEXT_OTHER_DELIMITERS)); + } + + @Test + public void givenNull_whenConvertingToTileCase_thenReturnNull() { + assertEquals(null, TitleCaseConverter.convertToTitleCaseIteratingChars(null)); + assertEquals(null, TitleCaseConverter.convertToTitleCaseSplitting(null)); + assertEquals(null, TitleCaseConverter.convertToTileCaseWordUtilsFull(null)); + assertEquals(null, TitleCaseConverter.convertToTileCaseWordUtils(null)); + assertEquals(null, TitleCaseConverter.convertToTitleCaseIcu4j(null)); + } + + @Test + public void givenEmptyString_whenConvertingToTileCase_thenReturnEmptyString() { + assertEquals("", TitleCaseConverter.convertToTitleCaseIteratingChars("")); + assertEquals("", TitleCaseConverter.convertToTitleCaseSplitting("")); + assertEquals("", TitleCaseConverter.convertToTileCaseWordUtilsFull("")); + assertEquals("", TitleCaseConverter.convertToTileCaseWordUtils("")); + assertEquals("", TitleCaseConverter.convertToTitleCaseIcu4j("")); + } + +} From dfbd91a678b8c1d41c98dd938b985cb7bc7b134c Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Wed, 20 Jun 2018 23:12:30 +0200 Subject: [PATCH 2/2] renamed test class --- .../src/main/java/com/baeldung/string/TitleCaseConverter.java | 2 +- ...leCaseConverterTest.java => TitleCaseConverterUnitTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java/src/test/java/com/baeldung/string/{TitleCaseConverterTest.java => TitleCaseConverterUnitTest.java} (98%) diff --git a/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java b/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java index e72ce44eda..0fdda86f2a 100644 --- a/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java +++ b/core-java/src/main/java/com/baeldung/string/TitleCaseConverter.java @@ -54,7 +54,7 @@ public class TitleCaseConverter { return text; } - return UCharacter.toTitleCase(text, null); + return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance()); } public static String convertToTileCaseWordUtilsFull(String text) { diff --git a/core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java b/core-java/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java rename to core-java/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java index 2da1c89795..2272565cd3 100644 --- a/core-java/src/test/java/com/baeldung/string/TitleCaseConverterTest.java +++ b/core-java/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import static org.junit.Assert.*; -public class TitleCaseConverterTest { +public class TitleCaseConverterUnitTest { private static final String TEXT = "tHis IS a tiTLe"; private static final String TEXT_EXPECTED = "This Is A Title";