конвертировать строку в титульный регистр

Преобразовать строку в титульный регистр

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 для преобразования, посколькуit checks the title case equivalent of a Character in Unicode.

Если мы проверим этот метод, используя эти входные данные:

tHis IS a tiTLe
tHis, IS a   tiTLe

Мы получаем следующие ожидаемые результаты:

This Is A Title
This, Is A   Title

2.2. Разделение на слова

Другой способ сделать это - разделитьString на слова, преобразовать каждое слово в регистр заголовка и, наконец, снова объединить все слова, используя тот же разделитель слов.

Давайте посмотрим на это в коде, снова используя пробел в качестве разделителя слов и полезный APIStream:

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. Настройка этой библиотеки объясняется в этомarticle.

Это обеспечиваетthe WordUtils class, that has the capitalizeFully() method, который делает именно то, что мы хотим достичь:

public static String convertToTileCaseWordUtilsFull(String text) {
    return WordUtils.capitalizeFully(text);
}

Как мы видим, это очень легко использовать, и если мы протестируем его с теми же входными данными, что и раньше, мы получим те же результаты:

This Is A Title
This, Is A   Title

Кроме того, классWordUtils предоставляетanother capitalize() method, который работает аналогичноcapitalizeFully(),, за исключениемonly changes the first character of each word. Это означает, что он не преобразует остальные символы в нижний регистр.

Посмотрим, как это можно использовать:

public static String convertToTileCaseWordUtils(String text) {
    return WordUtils.capitalize(text);
}

Теперь, если мы протестируем его с теми же входными данными, что и раньше, мы получим эти различные выходные данные:

THis IS A TiTLe
THis, IS A   TiTLe

4. Использование ICU4J

Другая библиотека, которую мы можем использовать, - это ICU4J, которая обеспечивает поддержку Юникода и глобализации.

Чтобы использовать его, нам нужно добавить эту зависимость в наш проект:


    com.ibm.icu
    icu4j
    61.1

Последнюю версию можно найтиhere.

Эта библиотека работает очень похоже наWordUtils, но мы можем указатьBreakIterator to, чтобы указать методу, как мы хотим разделитьString, и, следовательно, какие слова мы хотим преобразовать в заголовок кейс:

public static String convertToTitleCaseIcu4j(String text) {
    if (text == null || text.isEmpty()) {
        return text;
    }

    return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}

Как мы видим, у них есть специальныеBreakIterator для работы с заголовками. If we don’t specify any BreakIterator it uses the defaults from Unicode, которые в этом случае дают те же результаты.

Также обратите внимание, что этот метод позволяет нам указатьLocale ofString, которые мы конвертируем, чтобы выполнить преобразование для конкретной локали.

5. Заключение

В этой краткой статье мы показали, как преобразоватьString в формат заголовка в Java. Сначала мы использовали наши пользовательские реализации, а затем показали, как это сделать с помощью внешних библиотек.

Как всегда, доступен полный исходный код примеровover on GitHub.