445 votes

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

Existe-t-il une fonction intégrée à Java qui met en majuscule le premier caractère de chaque mot d'une chaîne, sans affecter les autres ?

Exemples :

  • jon skeet -> Jon Skeet
  • miles o'Brien -> Miles O'Brien (B reste capital, ce qui exclut le cas du titre)
  • old mcdonald -> Old Mcdonald *

*( Old McDonald serait aussi une trouvaille, mais je ne m'attends pas à ce qu'il soit si intelligent que ça).

Un coup d'œil rapide sur le Documentation sur les chaînes de caractères en Java ne révèle que toUpperCase() et toLowerCase(), qui ne fournissent bien sûr pas le comportement souhaité. Naturellement, les résultats de Google sont dominés par ces deux fonctions. J'ai l'impression qu'il s'agit d'une roue qui a déjà dû être inventée, mais il ne faut pas hésiter à la demander pour pouvoir l'utiliser à l'avenir. Merci !

19 votes

Qu'en est-il old mcdonald ? Si cela devait devenir Old McDonald ?

2 votes

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

0 votes

761voto

Bozho Points 273663

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

(Note : si vous voulez que "fOO BAr" devienne "Foo Bar", utilisez alors capitalizeFully(..) à la place)

5 votes

Je pense que vous voulez dire WordUtils.capitalize(str). Voir API pour plus de détails.

0 votes

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

85 votes

Je garde ma philosophie de toujours voter les réponses qui font référence aux bibliothèques communes.

232voto

nbolton Points 8244

Si vous ne vous souciez que de la première lettre du premier mot en majuscule :

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

3 votes

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

30 votes

En effet, c'était mon intention.

18 votes

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

82voto

True Soft Points 4870

La méthode suivante convertit toutes les lettres en majuscules/minuscules, en fonction de leur position à proximité 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]=='\'') { // You can add other chars here
      found = false;
    }
  }
  return String.valueOf(chars);
}

0 votes

J'améliorerais et simplifierais les conditions de la 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 d'une lettre majuscule.

0 votes

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

46voto

Neelam Singh Points 116

Essayez cette méthode très simple

exemple givenString="ram est un bon garçon"

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 est un bon garçon

1 votes

Ce code a fait planter notre serveur : java.lang.StringIndexOutOfBoundsException : String index out of range : 0

38 votes

@Chrizzz alors ne commettez pas de code que vous n'avez pas testé... Si vous fournissez une chaîne vide, il se plante. Votre faute, pas celle de Neelam.

1 votes

S'il y a un espace à la fin, il se bloque alors j'ai ajouté trim() d'abord et divisé la chaîne de caractères avec un espace.

17voto

Reid Mac Points 802
String toBeCapped = "i want this sentence capitalized";

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, tokens[i].length());
}

1 votes

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

1 votes

Mais cette solution ajoutera un espace au début. Donc vous devrez peut-être faire une coupe à gauche.

0 votes

Le mélange parfait de compacité et de lisibilité

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