1. Въведение
В този кратък урок ще покажем как да конвертирате String в формат на заглавието в Java.
Ще покажем различни начини за внедряване на персонализиран метод и също така ще покажем как да го направим с помощта на библиотеки на трети страни.
2. Основни Java решения
2.1. Повтаряне Чрез String героите
Един от начините да конвертирате String в заглавието е чрез итерация през всички символи на String .
За целта, когато намерим разделител на думи, ние пишем с главни букви следващия знак. След това променяме останалите символи с малки букви, докато стигнем до следващия разделител на думи.
Нека използваме празно пространство като разделител на думи и приложим това решение:
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(); }
Както виждаме, използваме метода Character.toTitleCase, за да извършим преобразуването, тъй като той проверява заглавието, еквивалентно на символ в Unicode.
Ако тестваме този метод, използвайки тези входове:
tHis IS a tiTLe tHis, IS a tiTLe
Получаваме следните очаквани резултати:
This Is A Title This, Is A Title
2.2. Разделяне на думи
Друг подход за това е разделянето на String на думи, превръщането на всяка дума в главен регистър и накрая отново се присъединява към всички думи, използвайки същия разделител на думи.
Нека го видим в кода, като използваме отново празното пространство като разделител на думи и полезния API на Stream :
private static final String WORD_SEPARATOR = " "; 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)); }
Използвайки същите входове като преди, получаваме абсолютно същите изходи:
This Is A Title This, Is A Title
3. Използване на Apache Commons
В случай, че не искаме да приложим собствен метод по избор, можем да използваме библиотеката Apache Commons. Настройката за тази библиотека е обяснена в тази статия.
Това осигурява на WordUtils клас, който има capitalizeFully () метод, който прави точно това, което искаме да постигнем:
public static String convertToTileCaseWordUtilsFull(String text) { return WordUtils.capitalizeFully(text); }
Както виждаме, това е много лесно за използване и ако го тестваме със същите входове като преди, ще получим същите резултати:
This Is A Title This, Is A Title
Също така, класът WordUtils предоставя друг метод с главни букви () , който работи подобно на капитализиране на Напълно (), с изключение на това , че променя само първия знак на всяка дума . Това означава, че не преобразува останалите символи в малки букви.
Нека да видим как можем да използваме това:
public static String convertToTileCaseWordUtils(String text) { return WordUtils.capitalize(text); }
Сега, ако го тестваме със същите входове като преди, ще получим тези различни изходи:
THis IS A TiTLe THis, IS A TiTLe
4. Използване на ICU4J
Друга библиотека, която можем да използваме, е ICU4J, която осигурява поддръжка на Unicode и глобализация.
За да го използваме, трябва да добавим тази зависимост към нашия проект:
com.ibm.icu icu4j 61.1
Най-новата версия можете да намерите тук.
Тази библиотека работи по много подобен начин като WordUtils , но можем да посочим BreakIterator, за да каже на метода как искаме да разделим низа и следователно кои думи искаме да преобразуваме в главни букви:
public static String convertToTitleCaseIcu4j(String text) { if (text == null || text.isEmpty()) { return text; } return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance()); }
Както виждаме, те имат специфичен BreakIterator за работа със заглавия. Ако не посочим BreakIterator, той използва настройките по подразбиране от Unicode , които в този случай генерират същите резултати.
Също така, предупреждение, че този метод ни позволява да се уточни локал на String ние конвертиране, за да се направи на локал-специфичен реализация.
5. Заключение
В тази кратка статия показахме как да конвертираме String в формат на заглавието в Java. Първо използвахме нашите персонализирани реализации, а след това показахме как да го направим с помощта на външни библиотеки.
Както винаги, пълният изходен код на примерите е достъпен в GitHub.