Skip to content

Commit 07f3ab6

Browse files
authored
Merge pull request eugenp#4517 from asturcon/tutorials/titleCase
BAEL-1928 - Convert a string to title case
2 parents 36dd488 + dfbd91a commit 07f3ab6

3 files changed

Lines changed: 144 additions & 0 deletions

File tree

core-java/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@
203203
<artifactId>mail</artifactId>
204204
<version>1.5.0-b01</version>
205205
</dependency>
206+
<dependency>
207+
<groupId>com.ibm.icu</groupId>
208+
<artifactId>icu4j</artifactId>
209+
<version>${icu4j.version}</version>
210+
</dependency>
206211
</dependencies>
207212

208213
<build>
@@ -473,6 +478,7 @@
473478
<maven-javadoc-plugin.version>3.0.0-M1</maven-javadoc-plugin.version>
474479
<exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
475480
<javax.mail.version>1.5.0-b01</javax.mail.version>
481+
<icu4j.version>61.1</icu4j.version>
476482
</properties>
477483

478484
</project>
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.baeldung.string;
2+
3+
import com.ibm.icu.lang.UCharacter;
4+
import com.ibm.icu.text.BreakIterator;
5+
import org.apache.commons.lang.WordUtils;
6+
7+
import java.util.Arrays;
8+
import java.util.stream.Collectors;
9+
10+
public class TitleCaseConverter {
11+
12+
private static final String WORD_SEPARATOR = " ";
13+
14+
public static String convertToTitleCaseIteratingChars(String text) {
15+
if (text == null || text.isEmpty()) {
16+
return text;
17+
}
18+
19+
StringBuilder converted = new StringBuilder();
20+
21+
boolean convertNext = true;
22+
for (char ch : text.toCharArray()) {
23+
if (Character.isSpaceChar(ch)) {
24+
convertNext = true;
25+
} else if (convertNext) {
26+
ch = Character.toTitleCase(ch);
27+
convertNext = false;
28+
} else {
29+
ch = Character.toLowerCase(ch);
30+
}
31+
converted.append(ch);
32+
}
33+
34+
return converted.toString();
35+
}
36+
37+
public static String convertToTitleCaseSplitting(String text) {
38+
if (text == null || text.isEmpty()) {
39+
return text;
40+
}
41+
42+
return Arrays
43+
.stream(text.split(WORD_SEPARATOR))
44+
.map(word -> word.isEmpty()
45+
? word
46+
: Character.toTitleCase(word.charAt(0)) + word
47+
.substring(1)
48+
.toLowerCase())
49+
.collect(Collectors.joining(WORD_SEPARATOR));
50+
}
51+
52+
public static String convertToTitleCaseIcu4j(String text) {
53+
if (text == null || text.isEmpty()) {
54+
return text;
55+
}
56+
57+
return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
58+
}
59+
60+
public static String convertToTileCaseWordUtilsFull(String text) {
61+
return WordUtils.capitalizeFully(text);
62+
}
63+
64+
public static String convertToTileCaseWordUtils(String text) {
65+
return WordUtils.capitalize(text);
66+
}
67+
68+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.baeldung.string;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import static org.junit.Assert.*;
7+
8+
public class TitleCaseConverterUnitTest {
9+
10+
private static final String TEXT = "tHis IS a tiTLe";
11+
private static final String TEXT_EXPECTED = "This Is A Title";
12+
private static final String TEXT_EXPECTED_NOT_FULL = "THis IS A TiTLe";
13+
14+
private static final String TEXT_OTHER_DELIMITERS = "tHis, IS a tiTLe";
15+
private static final String TEXT_EXPECTED_OTHER_DELIMITERS = "This, Is A Title";
16+
private static final String TEXT_EXPECTED_OTHER_DELIMITERS_NOT_FULL = "THis, IS A TiTLe";
17+
18+
@Test
19+
public void whenConvertingToTitleCaseIterating_thenStringConverted() {
20+
assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseIteratingChars(TEXT));
21+
}
22+
23+
@Test
24+
public void whenConvertingToTitleCaseSplitting_thenStringConverted() {
25+
assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseSplitting(TEXT));
26+
}
27+
28+
@Test
29+
public void whenConvertingToTitleCaseUsingWordUtilsFull_thenStringConverted() {
30+
assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTileCaseWordUtilsFull(TEXT));
31+
}
32+
33+
@Test
34+
public void whenConvertingToTitleCaseUsingWordUtils_thenStringConvertedOnlyFirstCharacter() {
35+
assertEquals(TEXT_EXPECTED_NOT_FULL, TitleCaseConverter.convertToTileCaseWordUtils(TEXT));
36+
}
37+
38+
@Test
39+
public void whenConvertingToTitleCaseUsingIcu4j_thenStringConverted() {
40+
assertEquals(TEXT_EXPECTED, TitleCaseConverter.convertToTitleCaseIcu4j(TEXT));
41+
}
42+
43+
@Test
44+
public void whenConvertingToTitleCaseWithDifferentDelimiters_thenDelimitersKept() {
45+
assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseIteratingChars(TEXT_OTHER_DELIMITERS));
46+
assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseSplitting(TEXT_OTHER_DELIMITERS));
47+
assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTileCaseWordUtilsFull(TEXT_OTHER_DELIMITERS));
48+
assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS_NOT_FULL, TitleCaseConverter.convertToTileCaseWordUtils(TEXT_OTHER_DELIMITERS));
49+
assertEquals(TEXT_EXPECTED_OTHER_DELIMITERS, TitleCaseConverter.convertToTitleCaseIcu4j(TEXT_OTHER_DELIMITERS));
50+
}
51+
52+
@Test
53+
public void givenNull_whenConvertingToTileCase_thenReturnNull() {
54+
assertEquals(null, TitleCaseConverter.convertToTitleCaseIteratingChars(null));
55+
assertEquals(null, TitleCaseConverter.convertToTitleCaseSplitting(null));
56+
assertEquals(null, TitleCaseConverter.convertToTileCaseWordUtilsFull(null));
57+
assertEquals(null, TitleCaseConverter.convertToTileCaseWordUtils(null));
58+
assertEquals(null, TitleCaseConverter.convertToTitleCaseIcu4j(null));
59+
}
60+
61+
@Test
62+
public void givenEmptyString_whenConvertingToTileCase_thenReturnEmptyString() {
63+
assertEquals("", TitleCaseConverter.convertToTitleCaseIteratingChars(""));
64+
assertEquals("", TitleCaseConverter.convertToTitleCaseSplitting(""));
65+
assertEquals("", TitleCaseConverter.convertToTileCaseWordUtilsFull(""));
66+
assertEquals("", TitleCaseConverter.convertToTileCaseWordUtils(""));
67+
assertEquals("", TitleCaseConverter.convertToTitleCaseIcu4j(""));
68+
}
69+
70+
}

0 commit comments

Comments
 (0)