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


306

Я использую Java для получения Stringввода от пользователя. Я пытаюсь сделать первую букву этого ввода заглавной.

Я попробовал это:

String name;

BufferedReader br = new InputStreamReader(System.in);

String s1 = name.charAt(0).toUppercase());

System.out.println(s1 + name.substring(1));

что привело к этим ошибкам компилятора:

  • Несоответствие типов: невозможно преобразовать InputStreamReader в BufferedReader

  • Невозможно вызвать toUppercase () для примитивного типа char


2
@Pontus - я не согласен. Для ввода «abcd» OP хочет вывод «Abcd». Кажется, довольно ясно, хотя вопрос мог бы быть лучше.
Коби


символ является примитивным типом данных в Java. Вы не можете разыменовать примитивный тип данных с помощью оператора точки (.). Вы должны подстроку первого символа name.substring (0,1);
Дивакар Раджеш

Ответы:


398
String str = "java";
String cap = str.substring(0, 1).toUpperCase() + str.substring(1);
// cap = "Java"

С вашим примером:

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    // Actually use the Reader
    String name = br.readLine();
    // Don't mistake String object with a Character object
    String s1 = name.substring(0, 1).toUpperCase();
    String nameCapitalized = s1 + name.substring(1);
    System.out.println(nameCapitalized);
}

1
Я думаю, вам нужно -1 после str.length (), иначе вы выйдете за пределы.
2010 года

@dutt: Нет, на самом деле это тоже было прекрасно. Но модификация Рекина сделала его идеальным. ;)
Адель Ансари

Commons Lang всегда лучше, чем писать свою собственную функцию, за исключением редких случаев, когда вы знаете лучше. Если вы не читали обыкновенный lang java doc в функции прописных букв, вам не следует писать свои собственные.
The.Laughing.Man

211

Я использовал WordUtils, он также имеет ту же функцию, но он заглавными буквами всех слов в предложении.
Сурбхит Рао

StringUtils.capitalize( "fred from jupiter" );производит "Fred from jupiter". Полегче ...: D
Удолине

WordUtils.capitalizeFully () работал для меня как очарование, так как он дает: WordUtils.capitalizeFully («я в порядке») = «Я в порядке»
Атул Шарма,

91

Укороченный / более быстрый код версии для прописных букв первой буквы строки:

String name  = "stackoverflow"; 
name = name.substring(0,1).toUpperCase() + name.substring(1).toLowerCase();

величина nameIS"Stackoverflow"


4
Мне нравится это решение, потому что оно гарантирует, что остальная часть строки будет в нижнем регистре. Это то, что мне было нужно при преобразовании имен перечислений ALL_CAPS.
Эллен Спертус

54

Используйте общую библиотеку Apache. Освободите свой мозг от этих вещей и избегайте исключений Null Pointer и Index Out Bound

Шаг 1:

Импортируйте общую библиотеку Apache, поместив ее в build.gradle зависимости

compile 'org.apache.commons:commons-lang3:3.6'

Шаг 2:

Если вы уверены, что ваша строка состоит из строчных букв или все, что вам нужно, это инициализировать первую букву, позвоните напрямую

StringUtils.capitalize(yourString);

Если вы хотите убедиться, что только первая буква написана с заглавной буквы, например, сделав это для an enum, toLowerCase()сначала позвоните и имейте в виду, чтоNullPointerException если входная строка равна нулю.

StringUtils.capitalize(YourEnum.STUFF.name().toLowerCase());
StringUtils.capitalize(yourString.toLowerCase());

Вот еще примеры, предоставленные Apache. это исключение бесплатно

StringUtils.capitalize(null)  = null
StringUtils.capitalize("")    = ""
StringUtils.capitalize("cat") = "Cat"
StringUtils.capitalize("cAt") = "CAt"
StringUtils.capitalize("'cat'") = "'cat'"

Примечание:

WordUtilsтакже включен в эту библиотеку, но не рекомендуется. Пожалуйста , не используйте это.


2
Спасибо. Я не могу поверить, что люди даже думают об использовании цикла for для такого рода задач
Альваро

@ Alvaro, в конце концов - люди используют цикл для этой задачи, проверьте исходный код apache. Это не означает, что люди не должны использовать хорошо проверенные решения.
Юрий Чернышов

@YuriyChernyshov уверен, я имел в виду, что они не должны заново изобретать колесо для производственного кода по большей части
Альваро

WordUtils.capitalizeFully () работал для меня как очарование, так как он дает: WordUtils.capitalizeFully ("я прекрасен") = "Я в порядке"
Атул Шарма

Я никогда не пойду за внешними библиотеками просто так How to capitalize the first letter of a String in Java?.
Переполнение стека

25

Ява:

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

public static String capitalize(String str)
{
    if(str == null) return str;
    return str.substring(0, 1).toUpperCase() + str.substring(1);
}

После этого просто позвоните str = capitalize(str)


Котлин:

str.capitalize()

Будет выброшено исключение, если strNULL. Убедитесь, что строка не пуста и имеет по крайней мере один символ перед использованием.
Аттакомский

@attacomsian вы правы, я обновляю java-код, а для Kotlin вы можете использовать str? .capitalize ()
Амир Хоссейн Гасеми

22

Что вы хотите сделать, это, вероятно, это:

s1 = name.substring(0, 1).toUpperCase() + name.substring(1);

(преобразует первый символ в верхний регистр и добавляет остаток исходной строки)

Кроме того, вы создаете устройство чтения входного потока, но никогда не читаете ни одной строки. Так nameбудет всегдаnull .

Это должно работать:

BufferedReader br = new InputstreamReader(System.in);
String name = br.readLine();
String s1 = name.substring(0, 1).toUpperCase() + name.substring(1);


12

Ниже решение будет работать.

String A = "stackOverflow";
String ACaps = A.toUpperCase().charAt(0)+A.substring(1,A.length());
//Will print StackOverflow

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


toUpperCase ограничен в вопросе.
Harpreet Sandhu - TheRootCoder

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

1
ой. Я пропустил эту вещь. (y)
Harpreet Sandhu - TheRootCoder

1
отличный ответ дорогой
Дулай Кулатхунга


7

Самый короткий тоже:

String message = "my message";    
message = Character.toUpperCase(message.charAt(0)) + message.substring(1);
System.out.println(message)    // Will output: My message

Работал на меня.


6

Установите строку в нижний регистр, затем установите первую букву в верхний, как это:

    userName = userName.toLowerCase();

затем заглавные буквы:

    userName = userName.substring(0, 1).toUpperCase() + userName.substring(1).toLowerCase();

подстрока просто получает кусок большей строки, затем мы объединяем их вместе.


7
Как я понял, первая строка кода бесполезна, так как остальная часть строки в любом случае установлена ​​в нижний регистр.
Håvard Nygård

6

Как насчет WordUtils.capitalizeFully () ?

import org.apache.commons.lang3.text.WordUtils;

public class Main {

    public static void main(String[] args) {

        final String str1 = "HELLO WORLD";
        System.out.println(capitalizeFirstLetter(str1)); // output: Hello World

        final String str2 = "Hello WORLD";
        System.out.println(capitalizeFirstLetter(str2)); // output: Hello World

        final String str3 = "hello world";
        System.out.println(capitalizeFirstLetter(str3)); // output: Hello World

        final String str4 = "heLLo wORld";
        System.out.println(capitalizeFirstLetter(str4)); // output: Hello World
    }

    private static String capitalizeFirstLetter(String str) {
        return WordUtils.capitalizeFully(str);
    }
}

6

Используйте этот метод, чтобы получить все первые буквы заглавными.

String captializeAllFirstLetter(String name) 
{
    char[] array = name.toCharArray();
    array[0] = Character.toUpperCase(array[0]);

    for (int i = 1; i < array.length; i++) {
        if (Character.isWhitespace(array[i - 1])) {
            array[i] = Character.toUpperCase(array[i]);
        }
    }

    return new String(array);
}


4

Вы также можете попробовать это:

 String s1 = br.readLine();
 char[] chars = s1.toCharArray();
 chars[0] = Character.toUpperCase(chars[0]);
 s1= new String(chars);
 System.out.println(s1);

Это лучше (оптимизировано), чем с использованием подстроки. (но не стоит беспокоиться о маленькой струне)


4

Вы можете использовать substring()для этого.

Но есть два разных случая:

Случай 1

Если Stringзаглавная буква предназначена для чтения человеком, вам также следует указать локаль по умолчанию:

String firstLetterCapitalized = 
    myString.substring(0, 1).toUpperCase(Locale.getDefault()) + myString.substring(1);

Дело 2

Если Stringвы используете заглавные буквы, чтобы их можно было прочитать на компьютере, избегайте их использования, Locale.getDefault()поскольку возвращаемая строка будет несовместимой в разных регионах, и в этом случае всегда указывайте один и тот же языковой стандарт (например,toUpperCase(Locale.ENGLISH) ). Это обеспечит согласованность строк, которые вы используете для внутренней обработки, что поможет вам избежать труднодоступных ошибок.

Примечание: Вы не должны указывать Locale.getDefault()на toLowerCase(), как это делается автоматически.


4

В Android Studio

Добавьте эту зависимость к вашему build.gradle (Module: app)

dependencies {
    ...
    compile 'org.apache.commons:commons-lang3:3.1'
    ...
}

Теперь вы можете использовать

String string = "STRING WITH ALL CAPPS AND SPACES";

string = string.toLowerCase(); // Make all lowercase if you have caps

someTextView.setText(WordUtils.capitalize(string));

4

если вы используете SPRING :

import static org.springframework.util.StringUtils.capitalize;
...


    return capitalize(name);

ПРИМЕЧАНИЕ. Если у вас уже есть зависимость Apache Common Lang, рассмотрите возможность использования их StringUtils.capitalize, как предлагают другие ответы.

ОСУЩЕСТВЛЕНИЕ: https://github.com/spring-projects/spring-framework/blob/64440a5f04a17b3728234afaa89f57766768decb/spring-core/src/main/java/org/springframework/util/StringUtil-355

REF: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StringUtils.html#capitalize-java.lang.String-


4

ЭТО БУДЕТ РАБОТАТЬ 101%

public class UpperCase {

    public static void main(String [] args) {

        String name;

        System.out.print("INPUT: ");
        Scanner scan = new Scanner(System.in);
        name  = scan.next();

        String upperCase = name.substring(0, 1).toUpperCase() + name.substring(1);
        System.out.println("OUTPUT: " + upperCase); 

    }

}

3

Это просто для того, чтобы показать вам, что вы не так не правы.

BufferedReader br = new InputstreamReader(System.in);
// Assuming name is not blank
String name = br.readLine(); 

//No more error telling that you cant convert char to string
String s1 = (""+name.charAt(0)).toUppercase());
// Or, as Carlos prefers. See the comments to this post.
String s1 = Character.toString(name.charAt(0)).toUppercase());

System.out.println(s1+name.substring(1));

Примечание: это вовсе не лучший способ сделать это. Это просто для того, чтобы показать ОП, что это можно сделать с помощью charAt(). ;)


1
+1 за "не так уж и плохо". Я бы предпочел Character.toString(name.charAt(0)) вместо того, ""+name.charAt(0)чтобы показать, что я действительно хочу сделать.
user85421

Никаких проверок нулевой длины. Длина может быть нулевой.
Chrispix


3

Вы можете использовать следующий код:

public static void main(String[] args) {

    capitalizeFirstLetter("java");
    capitalizeFirstLetter("java developer");
}

public static void capitalizeFirstLetter(String text) {

    StringBuilder str = new StringBuilder();

    String[] tokens = text.split("\\s");// Can be space,comma or hyphen

    for (String token : tokens) {
        str.append(Character.toUpperCase(token.charAt(0))).append(token.substring(1)).append(" ");
    }
    str.toString().trim(); // Trim trailing space

    System.out.println(str);

}

3

Попробуй это

Этот метод заключается в том, что рассмотрим слово «привет мир», которое этот метод превратит в «Hello World», с заглавными буквами начало каждого слова.

 private String capitalizer(String word){

        String[] words = word.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());
            }
        }
        return  sb.toString();

    }

Но этот код кажется довольно понятным, все методы также легко понять по их именам. Но спасибо за ваш комментарий, постараюсь сделать его более совершенным в следующий раз, я немного ленюсь :-).
Амин Махин

Работает как шарм!
The Vinceble

3

Данные ответы предназначены только для заглавных букв первой буквы одного слова. используйте следующий код, чтобы использовать заглавную строку

public static void main(String[] args) {
    String str = "this is a random string";
    StringBuilder capitalizedString = new StringBuilder();
    String[] splited = str.trim().split("\\s+");

    for (String string : splited) {         
        String s1 = string.substring(0, 1).toUpperCase();
        String nameCapitalized = s1 + string.substring(1);

        capitalizedString.append(nameCapitalized);
        capitalizedString.append(" ");
    }
    System.out.println(capitalizedString.toString().trim());
}

вывод : This Is A Random String


3

Если Input является UpperCase, тогда используйте следующее:

str.substring (0, 1) .toUpperCase () + str.substring (1) .toLowerCase ();

Если Input является LowerCase, тогда используйте следующее:

str.substring (0, 1) .toUpperCase () + str.substring (1);



2
public static String capitalizer(final String texto) {

    // split words
    String[] palavras = texto.split(" ");
    StringBuilder sb = new StringBuilder();

    // list of word exceptions
    List<String> excessoes = new ArrayList<String>(Arrays.asList("de", "da", "das", "do", "dos", "na", "nas", "no", "nos", "a", "e", "o", "em", "com"));

    for (String palavra : palavras) {

        if (excessoes.contains(palavra.toLowerCase()))
            sb.append(palavra.toLowerCase()).append(" ");
        else
            sb.append(Character.toUpperCase(palavra.charAt(0))).append(palavra.substring(1).toLowerCase()).append(" ");
    }
    return sb.toString().trim();
}

2

Вы можете использовать следующий код:

public static String capitalizeString(String string) {

    if (string == null || string.trim().isEmpty()) {
        return string;
    }
    char c[] = string.trim().toLowerCase().toCharArray();
    c[0] = Character.toUpperCase(c[0]);

    return new String(c);

}

Пример теста с помощью JUnit:

@Test
public void capitalizeStringUpperCaseTest() {

    String string = "HELLO WORLD  ";

    string = capitalizeString(string);

    assertThat(string, is("Hello world"));
}

@Test
public void capitalizeStringLowerCaseTest() {

    String string = "hello world  ";

    string = capitalizeString(string);

    assertThat(string, is("Hello world"));
}

2

Используя commons.lang.StringUtilsлучший ответ:

public static String capitalize(String str) {  
    int strLen;  
    return str != null && (strLen = str.length()) != 0 ? (new StringBuffer(strLen)).append(Character.toTitleCase(str.charAt(0))).append(str.substring(1)).toString() : str;  
}

Я нахожу это блестящим, так как он оборачивает строку с помощью StringBuffer. Вы можете манипулировать StringBuffer по своему усмотрению и, используя тот же экземпляр.


2

Еще один пример того, как вы можете сделать первую букву пользовательского ввода заглавной:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = br.readLine();
// handle supplementary characters
IntStream.concat(
        IntStream.of(string.codePointAt(0))
                .map(Character::toUpperCase), string.codePoints().skip(1)
)
.forEach(cp -> System.out.print(Character.toChars(cp)));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.