463 votes

Comment mettre en majuscule le premier caractère de chaque mot dans une chaîne de caractères

Y a-t-il une fonction intégrée à Java qui met en majuscule la première lettre de chaque mot dans une chaîne de caractères, sans affecter les autres ?

Exemples:

  • jon skeet -> Jon Skeet
  • miles o'Brien -> Miles O'Brien (B reste en majuscule, ce qui exclut la casse initiale)
  • old mcdonald -> Old Mcdonald*

*(Old McDonald serait aussi bien, mais je ne m'attends pas à ce qu'elle soit AUSSI intelligente.)

Un rapide coup d'œil à la Documentation sur les chaînes de caractères Java révèle seulement les fonctions toUpperCase() et toLowerCase(), qui bien sûr ne fournissent pas le comportement souhaité. Naturellement, les résultats de Google sont dominés par ces deux fonctions. Il semble que c'est une roue qui doit avoir été inventée déjà, donc ça ne fait pas de mal de demander pour que je puisse l'utiliser à l'avenir.

21 votes

Que diriez-vous de old mcdonald ? Doit-il devenir Old McDonald ?

2 votes

Je ne m'attends pas à ce que la fonction soit si intelligente. (Bien que si vous en avez une, je serais heureux de la voir.) Il suffit de mettre en majuscule la première lettre après un espace blanc, mais ignorez le reste.

0 votes

787voto

Bozho Points 273663

WordUtils.capitalize(str) (de apache commons-text)

(Remarque : si vous avez besoin que "fOO BAr" devienne "Foo Bar", utilisez capitalizeFully(..) à la place)

5 votes

Je pense que tu veux dire WordUtils.capitalize(str). Voir l'API pour plus de détails.

0 votes

Oui. StringUtils l'a aussi, mais pour les chaînes d'un seul mot. Merci.

90 votes

En respectant ma philosophie de toujours voter pour les réponses qui font référence aux bibliothèques communes.

233voto

nbolton Points 8244

Si vous êtes seulement préoccupé par la première lettre de la première mot en majuscule :

private String capitalize(final String line) {
   retourner Character.toUpperCase(line.charAt(0)) + line.substring(1);
}

4 votes

Cela ne change que la première lettre du premier mot

31 votes

En effet, c'était mon intention.

22 votes

@nbolton - Mais il ignore explicitement l'intention de la question, et échoue pour les cas donnés dans cet exemple - et il n'ajoute guère ou rien aux réponses précédemment données!

84voto

True Soft Points 4870

La méthode suivante convertit toutes les lettres en majuscules/minuscules, selon leur position près d'un espace ou d'autres caractères spéciaux.

public static String capitalizeString(String string) {
  char[] chars = string.toLowerCase().toCharArray();
  boolean found = false;
  for (int i = 0; i < chars.length; i++) {
    if (!found && Character.isLetter(chars[i])) {
      chars[i] = Character.toUpperCase(chars[i]);
      found = true;
    } else if (Character.isWhitespace(chars[i]) || chars[i]=='.' || chars[i]=='\'') { // Vous pouvez ajouter d'autres caractères ici
      found = false;
    }
  }
  return String.valueOf(chars);
}

0 votes

Je voudrais améliorer et simplifier les conditions de boucle : if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }.

0 votes

@bancer, avec votre exemple, vous ne pouvez pas contrôler quels caractères ne seront pas suivis par une lettre majuscule.

0 votes

@TrueSoft, Je ne vous comprends pas. Pourquoi avez-vous besoin de contrôler les caractères qui suivent une lettre majuscule? Comme je l'ai compris, il est important que le caractère précédent ne soit pas une lettre et mon exemple assure cela. Remplacez simplement votre bloc if-else-if par mon bloc if-else et effectuez un test.

48voto

Neelam Singh Points 116

Essayez cette méthode très simple

exemple donné="ram is good boy"

public static String toTitleCase(String givenString) {
    String[] arr = givenString.split(" ");
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < arr.length; i++) {
        sb.append(Character.toUpperCase(arr[i].charAt(0)))
            .append(arr[i].substring(1)).append(" ");
    }          
    return sb.toString().trim();
}  

La sortie sera : Ram Is Good Boy

1 votes

Ce code a provoqué le crash de notre serveur : java.lang.StringIndexOutOfBoundsException: l'index de la chaîne de caractères est hors limites : 0

39 votes

@Chrizzz ne mettez donc pas en ligne de code que vous n'avez pas testé... Si vous fournissez une chaîne vide, cela provoque un crash. Votre faute, pas celle de Neelam.

1 votes

Si un espace se trouve à la fin, cela provoque un plantage, alors j'ai ajouté trim() d'abord et j'ai divisé la chaîne avec un espace. Cela a parfaitement fonctionné

17voto

Reid Mac Points 802
Chaîne toBeCapped = "je veux que cette phrase soit en majuscules";

String[] tokens = toBeCapped.split("\\s");
toBeCapped = "";

for(int i = 0; i < tokens.length; i++){
    char capLetter = Character.toUpperCase(tokens[i].charAt(0));
    toBeCapped +=  " " + capLetter + tokens[i].substring(1);
}
toBeCapped = toBeCapped.trim();

1 votes

Hmmm, Je pense que la deuxième ligne de la boucle for devrait lire : toBeCapped += " " + capLetter + tokens[i].substring(1, tokens[i].length());

2 votes

Mais cette solution ajoutera un espace blanc au début. Vous devrez donc effectuer une suppression des espaces à gauche.

0 votes

Le mélange parfait de compact et lisible

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X