Как преобразовать строку в заглавный регистр в Android?

Я искал сверху и снизу, но смог найти только косвенные ссылки на этот тип вопроса. При разработке приложения для Android, если у вас есть строка, введенная пользователем, как вы можете преобразовать ее в заглавный регистр (т.е. сделать первую букву каждого слова заглавной)? Я бы предпочел не импортировать целую библиотеку (например, WordUtils Apache).


person Russ    schedule 12.09.2012    source источник


Ответы (14)


Вы ищете WordUtils.capitalize()метод.

person SLaks    schedule 12.09.2012
comment
Да, но, как я уже сказал, мне не очень хотелось импортировать целую библиотеку только для этого. - person Russ; 12.09.2012
comment
Я поддерживаю это, хотя это нарушает параметры вопроса. Как упоминалось в OP, это единственный вопрос о переполнении стека, который действительно решает эту проблему на Android, и я думаю, что возможность использования Apache commons должна быть упомянута в разделе ответов в качестве альтернативы, а не просто в самом вопросе. - person Kiirani; 10.07.2013
comment
@Russ рассмотрите возможность добавления общих ресурсов Apache lib, это всего ~ 200 КБ, но это очень удобно! Я бы сказал, что в большинстве проектов вы будете заново изобретать некоторые из этих методов с вероятностью 99%. - person Kirill Karmazin; 28.03.2019

У меня есть несколько указателей отсюда: uppercase">Android,нужно сделать в моем ListView первую букву каждого слова прописной, но в итоге накатил собственное решение (обратите внимание, такой подход предполагает, что все слова разделены одним пробелом, что было хорошо для моих нужд):

String[] words = input.getText().toString().split(" ");
StringBuilder sb = new StringBuilder();
if (words[0].length() > 0) {
    sb.append(Character.toUpperCase(words[0].charAt(0)) + words[0].subSequence(1, words[0].length()).toString().toLowerCase());
    for (int i = 1; i < words.length; i++) {
        sb.append(" ");
        sb.append(Character.toUpperCase(words[i].charAt(0)) + words[i].subSequence(1, words[i].length()).toString().toLowerCase());
    }
}
String titleCaseValue = sb.toString();

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

input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS);
person Russ    schedule 12.09.2012
comment
если у вас есть несколько пробелов, вы можете использовать split(\\s+) (разделяет на 1 или более пробелов) - person njzk2; 12.09.2012

это поможет тебе

EditText view = (EditText) find..
String txt = view.getText();
txt = String.valueOf(txt.charAt(0)).toUpperCase() + txt.substring(1, txt.length());
person Ankitkumar Makwana    schedule 12.09.2012

В XML это можно сделать так:

android:inputType="textCapWords"

Проверьте ссылку для других параметров, таких как регистр предложения, все заглавные буквы и т. д. здесь:

http://developer.android.com/reference/android/widget/TextView.html#attr_android:inputType

person zeeshan    schedule 09.07.2013
comment
В Android inputType можно использовать только с EditText, а не с TextView. - person user1652110; 15.05.2016
comment
Вы правы насчет EditText, но именно на это указывает документ Android. - person zeeshan; 15.05.2016

Вот метод WordUtils.capitalize() на случай, если вы не хотите импортировать весь класс.

public static String capitalize(String str) {
    return capitalize(str, null);
}

public static String capitalize(String str, char[] delimiters) {
    int delimLen = (delimiters == null ? -1 : delimiters.length);
    if (str == null || str.length() == 0 || delimLen == 0) {
        return str;
    }
    int strLen = str.length();
    StringBuffer buffer = new StringBuffer(strLen);
    boolean capitalizeNext = true;
    for (int i = 0; i < strLen; i++) {
        char ch = str.charAt(i);

        if (isDelimiter(ch, delimiters)) {
            buffer.append(ch);
            capitalizeNext = true;
        } else if (capitalizeNext) {
            buffer.append(Character.toTitleCase(ch));
            capitalizeNext = false;
        } else {
            buffer.append(ch);
        }
    }
    return buffer.toString();
}
private static boolean isDelimiter(char ch, char[] delimiters) {
    if (delimiters == null) {
        return Character.isWhitespace(ch);
    }
    for (int i = 0, isize = delimiters.length; i < isize; i++) {
        if (ch == delimiters[i]) {
            return true;
        }
    }
    return false;
}

Надеюсь, поможет.

person SafaOrhan    schedule 30.06.2014
comment
Этот код предполагает, что входная строка написана строчными буквами. Для обработки всего ввода в верхнем регистре вам нужно настроить следующую строку... buffer.append(ch); становится buffer.append(Character.toLowerCase(ch)); в 3-й ветви основного оператора else. - person Andrew Kelly; 23.09.2014

У меня была такая же проблема, и я решил ее с помощью этого:

import android.text.TextUtils;
...

String[] words = input.split("[.\\s]+");

for(int i = 0; i < words.length; i++) {
    words[i] = words[i].substring(0,1).toUpperCase()
               + words[i].substring(1).toLowerCase();
}

String titleCase = TextUtils.join(" ", words);

Обратите внимание, что в моем случае мне также нужно было удалить периоды. Любые символы, которые необходимо заменить пробелами, можно вставить между квадратными скобками во время «разделения». Например, следующее в конечном итоге заменит символы подчеркивания, точки, запятые или пробелы:

String[] words = input.split("[_.,\\s]+");

Конечно, это можно сделать намного проще с помощью "символ не слова":

String[] words = input.split("\\W+");

Стоит отметить, что числа и дефисы ЯВЛЯЮТСЯ считаются «словными символами», поэтому эта последняя версия полностью удовлетворила мои потребности и, надеюсь, поможет кому-то еще.

person gMale    schedule 12.06.2014

Просто сделайте что-то вроде этого:

public static String toCamelCase(String s){
    if(s.length() == 0){
        return s;
    }
    String[] parts = s.split(" ");
    String camelCaseString = "";
    for (String part : parts){
        camelCaseString = camelCaseString + toProperCase(part) + " ";
    }
    return camelCaseString;
}

public static String toProperCase(String s) {
    return s.substring(0, 1).toUpperCase() +
            s.substring(1).toLowerCase();
}
person mossman252    schedule 18.02.2016

Используйте эту функцию для преобразования данных в случае верблюда

 public static String camelCase(String stringToConvert) {
        if (TextUtils.isEmpty(stringToConvert))
            {return "";}
        return Character.toUpperCase(stringToConvert.charAt(0)) +
                stringToConvert.substring(1).toLowerCase();
    }
person Rajesh Tiwari    schedule 14.12.2017
comment
TextUtils.isEmpty() уже проверяет, является ли значение нулевым, поэтому вам не нужно проверять его самостоятельно. - person Lennon Spirlandelli; 11.05.2018

Kotlin – Android – функция Title Case/Camel Case

fun toTitleCase(str: String?): String? {

        if (str == null) {
            return null
        }

        var space = true
        val builder = StringBuilder(str)
        val len = builder.length

        for (i in 0 until len) {
            val c = builder[i]
            if (space) {
                if (!Character.isWhitespace(c)) {
                    // Convert to title case and switch out of whitespace mode.
                    builder.setCharAt(i, Character.toTitleCase(c))
                    space = false
                }
            } else if (Character.isWhitespace(c)) {
                space = true
            } else {
                builder.setCharAt(i, Character.toLowerCase(c))
            }
        }

        return builder.toString()
    }

ИЛИ

fun camelCase(stringToConvert: String): String {
    if (TextUtils.isEmpty(stringToConvert)) {
        return "";
    }
    return Character.toUpperCase(stringToConvert[0]) +
            stringToConvert.substring(1).toLowerCase();
}
person ramana vv    schedule 11.01.2019

Пожалуйста, проверьте решение ниже, оно будет работать как для нескольких строк, так и для одной строки для

 String toBeCapped = "i want this sentence capitalized";  
 String[] tokens = toBeCapped.split("\\s"); 

 if(tokens.length>0)
 {
   toBeCapped = ""; 

    for(int i = 0; i < tokens.length; i++)
    { 
     char capLetter = Character.toUpperCase(tokens[i].charAt(0)); 
     toBeCapped += " " + capLetter + tokens[i].substring(1, tokens[i].length()); 
    }
 }
 else
 {
  char capLetter = Character.toUpperCase(toBeCapped.charAt(0)); 
  toBeCapped += " " + capLetter + toBeCapped .substring(1, toBeCapped .length()); 
 }
person Ravindra Kushwaha    schedule 30.01.2015

Я упростил принятый ответ от @Russ, так что нет необходимости отличать первое слово в массиве строк от остальных слов. (Я добавляю пробел после каждого слова, затем просто обрезаю предложение, прежде чем возвращать предложение)

public static String toCamelCaseSentence(String s) {

    if (s != null) {
        String[] words = s.split(" ");

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < words.length; i++) {
            sb.append(toCamelCaseWord(words[i]));
        }

        return sb.toString().trim();
    } else {
        return "";
    }
}

обрабатывает пустые строки (несколько пробелов в предложении) и однобуквенные слова в строке.

public static String toCamelCaseWord(String word) {
    if (word ==null){
        return "";
    }

    switch (word.length()) {
        case 0:
            return "";
        case 1:
            return word.toUpperCase(Locale.getDefault()) + " ";
        default:
            char firstLetter = Character.toUpperCase(word.charAt(0));
            return firstLetter + word.substring(1).toLowerCase(Locale.getDefault()) + " ";
    }
}
person Angel Koh    schedule 16.10.2016

Я написал код на основе метода Apache WordUtils.capitalize(). Вы можете установить свои разделители как строку регулярного выражения. Если вы хотите, чтобы такие слова, как «из», были пропущены, просто установите их в качестве разделителя.

public static String capitalize(String str, final String delimitersRegex) {
    if (str == null || str.length() == 0) {
        return "";
    }

    final Pattern delimPattern;
    if (delimitersRegex == null || delimitersRegex.length() == 0){
        delimPattern = Pattern.compile("\\W");
    }else {
        delimPattern = Pattern.compile(delimitersRegex);
    }

    final Matcher delimMatcher = delimPattern.matcher(str);
    boolean delimiterFound = delimMatcher.find();

    int delimeterStart = -1;
    if (delimiterFound){
        delimeterStart = delimMatcher.start();
    }

    final int strLen = str.length();
    final StringBuilder buffer = new StringBuilder(strLen);

    boolean capitalizeNext = true;
    for (int i = 0; i < strLen; i++) {
        if (delimiterFound && i == delimeterStart) {
            final int endIndex = delimMatcher.end();

            buffer.append( str.substring(i, endIndex) );
            i = endIndex;

            if( (delimiterFound = delimMatcher.find()) ){
                delimeterStart = delimMatcher.start();
            }

            capitalizeNext = true;
        } else {
            final char ch = str.charAt(i);

            if (capitalizeNext) {
                buffer.append(Character.toTitleCase(ch));
                capitalizeNext = false;
            } else {
                buffer.append(ch);
            }
        }
    }
    return buffer.toString();
}

Надеюсь, это поможет :)

person ErickBergmann    schedule 06.04.2017

Если вы ищете формат Title case, вам могут помочь эти функции расширения kotlin.

fun String.toTitleCase(): String {
if (isNotEmpty()) {
    val charArray = this.toCharArray()
    return buildString {
        for (i: Int in charArray.indices) {
            val c = charArray[i]
            // start find space from 1 because it can cause invalid index of position if (-1)
            val previous = if (i > 0) charArray[(i - 1)] else null
            // true if before is space char
            val isBeforeSpace = previous?.let { Character.isSpaceChar(it) } ?: false
            // append char to uppercase if current index is 0 or before is space
            if (i == 0 || isBeforeSpace) append(c.toUpperCase()) else append(c)
            print("char:$c, \ncharIndex: $i, \nisBeforeSpace: $isBeforeSpace\n\n")
        }
        print("result: $this")
    }
} return this }

И реализовать как

data class User(val name :String){ val displayName: String get() = name.toTitleCase() }
person Ahmad Yani Dwi BakTiko    schedule 02.12.2020

person    schedule
comment
Отлично, но для тех, кто хочет исправить ситуацию, если автор пропустил пробел перед новым предложением, вы можете изменить его на =› else if (Character.isWhitespace(c) || ​​c == '.' || c == '!' || c == '?') { space = true; } - person BNY; 08.12.2018
comment
Спасибо.. Сработала, понравилась прелесть.. ;) - person MashukKhan; 02.04.2019