Como capitalizar a primeira letra de uma String em Java?

305

Estou usando Java para obter uma Stringentrada do usuário. Estou tentando fazer a primeira letra desta entrada em maiúscula.

Eu tentei isso:

String name;

BufferedReader br = new InputStreamReader(System.in);

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

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

o que levou a esses erros do compilador:

  • Incompatibilidade de tipo: não é possível converter de InputStreamReader em BufferedReader

  • Não é possível chamar toUppercase () no tipo primitivo char

sumithra
fonte
2
@ Pontus - eu discordo. Para a entrada "abcd", o OP deseja a saída "Abcd". Parece bem claro, embora a pergunta pudesse ter sido melhor.
Kobi
caractere é um tipo de dados primitivo em Java. Você não pode desreferenciar um tipo de dados primitivo com o operador ponto (.). Você deve substring o primeiro caractere por name.substring (0,1);
Divakar Rajesh

Respostas:

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

Com o seu exemplo:

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);
}
Rekin
fonte
1
Eu acho que você precisa de -1 após str.length (), caso contrário, você sairá dos limites.
dutt
@ Dutt: Não, na verdade, isso estava perfeitamente bem também. Mas a modificação de Rekin tornou perfeito. ;)
Adeel Ansari
commons lang é sempre melhor do que escrever sua própria função, exceto em casos raros em que você conhece melhor. Se você não leu o common lang java doc na função capitalize, não deveria escrever o seu próprio.
The.Laughing.Man
211

StringUtils.capitalize(..) de commons-lang

Bozho
fonte
Eu estava usando o WordUtils, ele também tem a mesma função, mas maiúscula as primeiras letras de todas as palavras em uma frase.
Surbhit Rao
StringUtils.capitalize( "fred from jupiter" );produz "Fred from jupiter". Fácil ...: D
udoline
WordUtils.capitalizeFully () funcionou para mim como charme, pois dá: WordUtils.capitalizeFully ( "Eu estou bem") = "Eu estou bem"
Atul Sharma
91

O código da versão mais curta / mais rápida para colocar em maiúscula a primeira letra de uma String é:

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

o valor de nameé"Stackoverflow"

Jorgesys
fonte
4
Eu gosto dessa solução porque garante que o restante da string seja minúsculo. Era disso que eu precisava ao converter os nomes de enum ALL_CAPS.
Ellen Spertus
54

Use a biblioteca comum do Apache. Liberte seu cérebro desses materiais e evite o ponteiro nulo e o índice fora de exceções limitadas

Passo 1:

Importe a biblioteca lang comum do apache colocando isso em build.gradledependências

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

Passo 2:

Se você tiver certeza de que sua string é minúscula ou tudo o que precisa é inicializar a primeira letra, ligue diretamente para

StringUtils.capitalize(yourString);

Se você deseja certificar-se de que apenas a primeira letra seja maiúscula, como fazer isso para um enum, chame toLowerCase()primeiro e lembre-se de que ele será gerado NullPointerExceptionse a sequência de entrada for nula.

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

Aqui estão mais amostras fornecidas pelo apache. é livre de exceções

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

Nota:

WordUtilstambém está incluído nesta biblioteca, mas está obsoleto. Por favor , não use isso.

Fangming
fonte
2
Obrigado. Eu não posso acreditar que as pessoas sequer pensar em usar um loop for para este tipo de tarefa
Alvaro
@ Alvaro, no final do dia - as pessoas usam loop para esta tarefa, verifique o código-fonte apache. Isso não significa que as pessoas não devam usar soluções bem testadas.
Yuriy Chernyshov
@YuriyChernyshov certeza, eu quis dizer que eles não devem ser reinventar a roda para código de produção para a maior parte
Alvaro
WordUtils.capitalizeFully () funcionou para mim como charme, pois dá: WordUtils.capitalizeFully ( "Eu estou bem") = "Eu estou bem"
Atul Sharma
Eu nunca vou para bibliotecas externas apenas para pouco propósito How to capitalize the first letter of a String in Java?.
Stack Overflow
25

Java:

simplesmente um método auxiliar para capitalizar cada string.

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

Depois disso, basta ligar str = capitalize(str)


Kotlin:

str.capitalize()
Amir Hossein Ghasemi
fonte
Irá lançar uma exceção se o strfor nulo. Verifique se a sequência não é nula e possui pelo menos um caractere antes de usá-lo.
attacomsian 14/09/19
@attacomsian você está certo, código que eu atualização java e para Kotlin você pode usar str .capitalize ()?
Amir Hossein Ghasemi
22

O que você quer fazer é provavelmente o seguinte:

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

(converte o primeiro caractere em maiúsculas e adiciona o restante da string original)

Além disso, você cria um leitor de fluxo de entrada, mas nunca lê nenhuma linha. Assim namesempre será null.

Isso deve funcionar:

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

WordUtils.capitalize(java.lang.String)do Apache Commons .

Zaki
fonte
Oi! Você poderia explicar como implementar isso no meu projeto? Eu posso ver qualquer link de download de arquivo no seu URL. Obrigado
GrayFox
Este método está obsoleto. Por favor, use StringUtils de commons-lang
Fangming
12

A solução abaixo funcionará.

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

Você não pode usar toUpperCase () em caracteres primitivos, mas pode fazer String inteira em maiúsculas primeiro e depois pegar o primeiro caractere e depois anexá-lo à substring, como mostrado acima.

Jijil Kakkadathu
fonte
toUpperCase está restrito em questão.
Harpreet Sandhu - TheRootCoder 25/10
Em questão, ele estava tentando usar o UpperCase no primitivo que não funcionaria.
Jijil Kakkadathu 25/10
1
ah Eu senti falta dessa coisa. (y)
Harpreet Sandhu - TheRootCoder 26/10
1
grande resposta querida
Dulaj Kulathunga
7

Mais curto também:

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

Trabalhou para mim.

Dassi Orleando
fonte
6

Defina a string como minúscula e, em seguida, defina a primeira letra como maiúscula:

    userName = userName.toLowerCase();

depois colocar em maiúscula a primeira letra:

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

substring está apenas obtendo um pedaço de uma string maior, então estamos combinando-os novamente.

AlexZeCoder
fonte
7
Como eu entendi, a primeira linha de código é inútil, pois o restante da string é definido como minúsculo de qualquer maneira.
Håvard Nygård
6

E o 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);
    }
}
Arpit Aggarwal
fonte
6

Use este método utilitário para obter todas as primeiras letras maiúsculas.

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);
}
Krrish
fonte
5
String str1 = "hello";
str1.substring(0, 1).toUpperCase()+str1.substring(1);
Aditya Parmar
fonte
4

Você também pode tentar o seguinte:

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

Isso é melhor (otimizado) do que com o uso de substring. (mas não se preocupe com pequenas cordas)

jerjer
fonte
4

Você pode usar substring()para fazer isso.

Mas existem dois casos diferentes:

Caso 1

Se o que Stringvocê está colocando em maiúsculas pretende ser legível por humanos, você também deve especificar o código do idioma padrão:

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

Caso 2

Se o que Stringvocê está usando maiúsculas for legível por máquina, evite usá-lo Locale.getDefault()porque a sequência retornada será inconsistente em diferentes regiões e, nesse caso, sempre especifique o mesmo código do idioma (por exemplo,toUpperCase(Locale.ENGLISH) ). Isso garantirá que as strings que você está usando para o processamento interno sejam consistentes, o que ajudará a evitar erros difíceis de encontrar.

Nota: Você não precisa especificar Locale.getDefault()para toLowerCase(), pois isso é feito automaticamente.

JDJ
fonte
4

No Android Studio

Adicione essa dependência ao seu build.gradle (Module: app)

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

Agora você pode usar

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

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

someTextView.setText(WordUtils.capitalize(string));
Michael
fonte
4

se você usar o SPRING :

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


    return capitalize(name);

NOTA: Se você já possui dependência do Apache Common Lang, considere usar o StringUtils.capitalize, conforme sugerem outras respostas.

IMPLEMENTAÇÃO: https://github.com/spring-projects/spring-framework/blob/64440a5f04a17b3728234afaa89f57766768decb/spring-core/src/main/java/org/springframework/util/StringUtils.java#L5

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

epóxi
fonte
4

VAI TRABALHAR 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); 

    }

}
u_mewara
fonte
3

Isso é apenas para mostrar que você não estava errado.

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));

Nota: Essa não é a melhor maneira de fazê-lo. Isso é apenas para mostrar ao OP que isso pode ser feito usando charAt()também. ;)

Adeel Ansari
fonte
1
+1 para "não está errado". Eu preferiria em Character.toString(name.charAt(0)) vez de ""+name.charAt(0)mostrar o que realmente quero fazer.
user85421
Nenhuma verificação de comprimento nulo. O comprimento pode ser zero.
precisa
3

Isso vai funcionar

char[] array = value.toCharArray();

array[0] = Character.toUpperCase(array[0]);

String result = new String(array);
Mohamed Abdullah J
fonte
3

Você pode usar o seguinte código:

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);

}
Mulalo Madida
fonte
3

tente este

O que esse método faz é que, considere a palavra "olá mundo", esse método a transforme em "olá mundo", com maiúsculas no início de cada palavra.

 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();

    }
Ameen Maheen
fonte
Mas esse código parece bastante compreensível. Todos os métodos são fáceis de entender pelos nomes também .mas, obrigado pelo seu comentário, tentará tornar mais perfeito a partir da próxima vez, fico com preguiça de vez em quando :-).
Ameen Maheen
Funciona como um encanto!
TheVinceble
3

As respostas dadas são para colocar em maiúscula apenas a primeira letra de uma palavra. use o código a seguir para colocar em maiúscula uma seqüência inteira.

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());
}

resultado : This Is A Random String

Vimukthi_R
fonte
3

Se Input for UpperCase, use o seguinte:

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

Se Entrada for LowerCase, use o seguinte:

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

Raj Kumar
fonte
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();
}
Doc Brown
fonte
2

Você pode usar o seguinte código:

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);

}

exemplo de teste com 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"));
}
David Navarro Astudillo
fonte
2

Usando commons.lang.StringUtilsa melhor resposta é:

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;  
}

Acho isso brilhante, pois envolve a string com um StringBuffer. Você pode manipular o StringBuffer como desejar e usando a mesma instância.

velocidade
fonte
2

Ainda outro exemplo, como você pode colocar a primeira letra da entrada do usuário em maiúscula:

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)));

fonte