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.

diya
fonte
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
1
relacionado: stackoverflow.com/questions/1149855
ManBugra

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.

WhiteFang34
fonte
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.

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

Haseeb
fonte
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);
Igor Rybak
fonte
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
Samet ÖZTOPRAK
fonte
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);
Avantika
fonte
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();
        }
    }

}
edgarmtze
fonte
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.

Vismay Hingwala
fonte
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);
} 
nada
fonte
1

Solução com StringBuilder:

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

.. com base em respostas anteriores

Gene Bo
fonte
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);
    }
Jeff Padgett
fonte
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(" ")
Aklesh Singh
fonte
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>
Chris Halcrow
fonte
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]));
  }

}
koppor
fonte
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);
Saurabh Verma
fonte
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));
Sasa
fonte
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);
Jason Bierbrauer
fonte
0

Dada a inputsequência:

Character.toUpperCase(input.charAt(0)) + input.substring(1).toLowerCase()
GVillani82
fonte
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();
}
Zhifan Cai
fonte
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;
    }
Takhir Atamuratov
fonte
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]
Hardian
fonte
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());
}
Vimbai Chatitai
fonte
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.

attacomsian
fonte
-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);
    }
 }
Bimlendu Kumar
fonte