Como capitalizar a primeira letra da palavra em uma string usando Java?


223

Sequências de exemplo

one thousand only
two hundred
twenty
seven

Como altero o primeiro caractere de uma sequência em maiúscula e não altero o caso de nenhuma das outras letras?

Após a alteração, deve ser:

One thousand only
Two hundred
Twenty
Seven

Nota: Não quero usar o apache.commons.lang.WordUtils para fazer isso.


1
@eat_a_lemon: é muito melhor usar Character.toUpperCase (), pois lida com casos que não sejam az (por exemplo, números, pontuação, letras com sinais diacríticos, caracteres não latinos).
— Simon Nickerson

Respostas:


544

Se você deseja apenas colocar em maiúscula a primeira letra de uma sequência nomeada inpute deixar o resto em paz:

String output = input.substring(0, 1).toUpperCase() + input.substring(1);

Agora outputterá o que você quer. Verifique se você inputtem pelo menos um caractere antes de usá-lo, caso contrário, você receberá uma exceção.


37
Além disso, eu pegaria primeiro toda a entrada e a tornaria minúscula ou retrabalharia o seu exemplo da seguinte maneira: String output = input.substring (0, 1) .toUpperCase () + input.substring (1) .toLowerCase ();
— precisa

2
E você quiser verificar o comprimento da corda, como poderia ser uma seqüência de carta, ou mesmo 0.
— Marek

1
Encontrei isso aqui para a criação de nomes de getter e setter, portanto, para LowerCase no restante da String, o nome do campo será interrompido. A resposta dada é perfeita para mim.
— Kaiser

85
public String capitalizeFirstLetter(String original) {
    if (original == null || original.length() == 0) {
        return original;
    }
    return original.substring(0, 1).toUpperCase() + original.substring(1);
}

Apenas ... uma solução completa, vejo que acabou de combinar o que todo mundo acabou postando = P.


12
Agradável. Eu "one-linered" it: return original.length() == 0 ? original : original.substring(0, 1).toUpperCase() + original.substring(1);
— mharper 20/09/2013

2
@ sharper:, if length() == 0não podemos dizer com segurança que é ""e devolvê-lo em vez de original? Economiza alguns caracteres em uma linha. Pergunto porque sinto que o Java é uma linguagem tão cheia de pegadinhas que, sinceramente, não ficaria surpreso se houvesse outra maneira de ter uma sequência de comprimento zero.
— ArtOfWarfare 3/03/15

Você fala toda a verdade @ArtOfWarfare.
— mharper

Nota: você também pode fazer isso funcionar com letras que não sejam do inglês. Nesse caso, você deve especificar a localidade no método toUpperCase ().
— Makalele 29/09/16

Não é possível usar String.toUpperCase(Locale)para uma sequência arbitrária, porque o Local precisa corresponder ao texto. Sim, ele deve ser usado, mas nem sempre está claro que Localeusar ...
— Christopher Schultz

81

A maneira mais simples é usar org.apache.commons.lang.StringUtilsclasse

StringUtils.capitalize(Str);


8
Pequena nota lateral aqui. Funciona apenas para cadeias que ainda não estão em maiúsculas.
— jobbert

5
@jobbert Por favor, esclareça seu comentário. Se as seqüências de caracteres já estiverem em maiúsculas, as não serão capitalizadas, apesar de ser um método chamado capitalize?
— Cœur

25

Além disso, existe org.springframework.util.StringUtilsno Spring Framework :

StringUtils.capitalize(str);


6
String sentence = "ToDAY   WeAthEr   GREat";    
public static String upperCaseWords(String sentence) {
        String words[] = sentence.replaceAll("\\s+", " ").trim().split(" ");
        String newSentence = "";
        for (String word : words) {
            for (int i = 0; i < word.length(); i++)
                newSentence = newSentence + ((i == 0) ? word.substring(i, i + 1).toUpperCase(): 
                    (i != word.length() - 1) ? word.substring(i, i + 1).toLowerCase() : word.substring(i, i + 1).toLowerCase().toLowerCase() + " ");
        }

        return newSentence;
    }
//Today Weather Great

Isso não responde à pergunta do OP. Uma vez que muda o caso das outras letras.
— Lieuwe Rooijakkers

Olhe para a pergunta. Provavelmente, você não entendeu bem a pergunta.
— Samet ÖZTOPRAK 5/12/19

3
String s=t.getText().trim();
int l=s.length();
char c=Character.toUpperCase(s.charAt(0));
s=c+s.substring(1);
for(int i=1; i<l; i++)
    {
        if(s.charAt(i)==' ')
        {
            c=Character.toUpperCase(s.charAt(i+1));
            s=s.substring(0, i) + c + s.substring(i+2);
        }
    }
    t.setText(s);

2
Isso colocará em maiúscula a primeira letra de cada palavra, não a sequência como um todo. Veja os exemplos fornecidos pelo OP. Também pode haver problemas se houver um espaço no final da string.
— tobias_k

2

Aqui está (espero que isso lhe dê a idéia):

/*************************************************************************
 *  Compilation:  javac Capitalize.java
 *  Execution:    java Capitalize < input.txt
 * 
 *  Read in a sequence of words from standard input and capitalize each
 *  one (make first letter uppercase; make rest lowercase).
 *
 *  % java Capitalize
 *  now is the time for all good 
 *  Now Is The Time For All Good 
 *  to be or not to be that is the question
 *  To Be Or Not To Be That Is The Question 
 *
 *  Remark: replace sequence of whitespace with a single space.
 *
 *************************************************************************/

public class Capitalize {

    public static String capitalize(String s) {
        if (s.length() == 0) return s;
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }

    public static void main(String[] args) {
        while (!StdIn.isEmpty()) {
            String line = StdIn.readLine();
            String[] words = line.split("\\s");
            for (String s : words) {
                StdOut.print(capitalize(s) + " ");
            }
            StdOut.println();
        }
    }

}

e não mudar o caso das outras letras. Além disso, seu uso StdIne StdOutnão é muito Java-y. :-)
— Simon Nickerson

2

É necessário apenas um código de linha simples para isso. se for String A = scanner.nextLine(); necessário, escreva-o para exibir a sequência com a primeira letra maiúscula.

System.out.println(A.substring(0, 1).toUpperCase() + A.substring(1));

E está feito agora.


1

Exemplo usando a classe StringTokenizer:

String st = "  hello all students";
String st1;
char f;
String fs="";
StringTokenizer a= new StringTokenizer(st);
while(a.hasMoreTokens()){   
        st1=a.nextToken();
        f=Character.toUpperCase(st1.charAt(0));
        fs+=f+ st1.substring(1);
        System.out.println(fs);
} 

1

Solução com StringBuilder:

value = new StringBuilder()
                .append(value.substring(0, 1).toUpperCase())
                .append(value.substring(1))
                .toString();

.. com base em respostas anteriores


1

Somando tudo, é uma boa idéia aparar para obter espaço em branco extra no início da string. Caso contrário, .substring (0,1) .toUpperCase tentará capitalizar um espaço em branco.

    public String capitalizeFirstLetter(String original) {
        if (original == null || original.length() == 0) {
            return original;
        }
        return original.trim().substring(0, 1).toUpperCase() + original.substring(1);
    }

1

Minha abordagem funcional. capitiliza o primeiro caractere da sentença após a saída em branco do parágrafo inteiro.

Para capturar somente o primeiro caractere da palavra, basta remover .split ("")

           b.name.split(" ")
                 .filter { !it.isEmpty() }
                 .map { it.substring(0, 1).toUpperCase() 
                 +it.substring(1).toLowerCase() }
                  .joinToString(" ")

1

Atualização julho 2019

Atualmente, a função de biblioteca mais atualizada para fazer isso está contida em org.apache.commons.lang3.StringUtils

import org.apache.commons.lang3.StringUtils;

StringUtils.capitalize(myString);

Se você estiver usando o Maven, importe a dependência no seu pom.xml:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.9</version>
</dependency>

1

Mesmo para código "simples", eu usaria bibliotecas. O problema não é o código em si, mas os casos de teste já existentes que cobrem casos excepcionais. Pode ser null, cadeias vazias, cadeias em outros idiomas.

A parte de manipulação de palavras foi removida do Apache Commons Lang. Agora é colocado no texto Apache Commons . Obtenha-o em https://search.maven.org/artifact/org.apache.commons/commons-text .

Você pode usar o WordUtils.capitalize (String str) no Apache Commons Text. É mais poderoso do que você pediu. Também pode capitalizar fulle (por exemplo, fixar"oNe tousand only" ).

Como funciona em texto completo, é preciso dizer a ele para colocar em maiúscula apenas a primeira palavra.

WordUtils.capitalize("one thousand only", new char[0]);

Classe JUnit completa para permitir a reprodução com a funcionalidade:

package io.github.koppor;

import org.apache.commons.text.WordUtils;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class AppTest {

  @Test
  void test() {
    assertEquals("One thousand only", WordUtils.capitalize("one thousand only", new char[0]));
  }

}

1

se você quiser colocar apenas a primeira letra em maiúscula, o código abaixo pode ser usado

String output = input.substring(0, 1).toUpperCase() + input.substring(1);

1

Na verdade, você obterá o melhor desempenho se evitar o +operador e usar concat()neste caso. É a melhor opção para mesclar apenas 2 strings (embora não seja tão bom para muitas strings). Nesse caso, o código ficaria assim:

String output = input.substring(0, 1).toUpperCase().concat(input.substring(1));

0

Usa isto:

char[] chars = {Character.toUpperCase(A.charAt(0)), 
Character.toUpperCase(B.charAt(0))};
String a1 = chars[0] + A.substring(1);
String b1 = chars[1] + B.substring(1);

0

Dada a inputsequência:

Character.toUpperCase(input.charAt(0)) + input.substring(1).toLowerCase()

0

Você pode tentar o seguinte código:

public string capitalize(str) {
    String[] array = str.split(" ");
    String newStr;
    for(int i = 0; i < array.length; i++) {
        newStr += array[i].substring(0,1).toUpperCase() + array[i].substring(1) + " ";
    }
    return newStr.trim();
}

0
public static String capitalize(String str){
        String[] inputWords = str.split(" ");
        String outputWords = "";
        for (String word : inputWords){
            if (!word.isEmpty()){
                outputWords = outputWords + " "+StringUtils.capitalize(word);
            }
        }
        return outputWords;
    }

0

Gostaria de adicionar uma verificação NULL e IndexOutOfBoundsException na resposta aceita.

String output = input.substring(0, 1).toUpperCase() + input.substring(1);

Código Java:

  class Main {
      public static void main(String[] args) {
        System.out.println("Capitalize first letter ");
        System.out.println("Normal  check #1      : ["+ captializeFirstLetter("one thousand only")+"]");
        System.out.println("Normal  check #2      : ["+ captializeFirstLetter("two hundred")+"]");
        System.out.println("Normal  check #3      : ["+ captializeFirstLetter("twenty")+"]");
        System.out.println("Normal  check #4      : ["+ captializeFirstLetter("seven")+"]");

        System.out.println("Single letter check   : ["+captializeFirstLetter("a")+"]");
        System.out.println("IndexOutOfBound check : ["+ captializeFirstLetter("")+"]");
        System.out.println("Null Check            : ["+ captializeFirstLetter(null)+"]");
      }

      static String captializeFirstLetter(String input){
             if(input!=null && input.length() >0){
                input = input.substring(0, 1).toUpperCase() + input.substring(1);
            }
            return input;
        }
    }

Resultado:

Normal  check #1      : [One thousand only]
Normal  check #2      : [Two hundred]
Normal  check #3      : [Twenty]
Normal  check #4      : [Seven]
Single letter check   : [A]
IndexOutOfBound check : []
Null Check            : [null]

0

A seguir, você fornecerá a mesma saída consistente, independentemente do valor da sua inputString:

if(StringUtils.isNotBlank(inputString)) {
    inputString = StringUtils.capitalize(inputString.toLowerCase());
}

0

1. Usando o substring()método String

public static String capitalize(String str) {
    if(str== null || str.isEmpty()) {
        return str;
    }

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

Agora basta chamar o capitalize()método para converter a primeira letra de uma string em maiúscula:

System.out.println(capitalize("stackoverflow")); // Stackoverflow
System.out.println(capitalize("heLLo")); // HeLLo
System.out.println(capitalize(null)); // null

2. Apache Commons Lang

A StringUtilsclasse do Commons Lang fornece o capitalize()método que também pode ser usado para essa finalidade:

System.out.println(StringUtils.capitalize("apache commons")); // Apache commons
System.out.println(StringUtils.capitalize("heLLO")); // HeLLO
System.out.println(StringUtils.uncapitalize(null)); // null

Adicione a seguinte dependência ao seu pom.xmlarquivo (somente para Maven):

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

Aqui está um artigo que explica essas duas abordagens em detalhes.


-1
class Test {
     public static void main(String[] args) {
        String newString="";
        String test="Hii lets cheCk for BEING String";  
        String[] splitString = test.split(" ");
        for(int i=0; i<splitString.length; i++){
            newString= newString+ splitString[i].substring(0,1).toUpperCase() 
                    + splitString[i].substring(1,splitString[i].length()).toLowerCase()+" ";
        }
        System.out.println("the new String is "+newString);
    }
 }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.