512 votes

Comment remplir une chaîne de caractères en Java ?

Existe-t-il un moyen simple de rembourrer des chaînes de caractères en Java ?

Cela semble être quelque chose qui devrait se trouver dans une API de type StringUtil, mais je ne trouve rien qui fasse cela.

738voto

RealHowTo Points 13117

Depuis Java 1.5, String.format() peut être utilisé pour remplacer une chaîne de caractères par une chaîne de caractères gauche/droite.

public static String padRight(String s, int n) {
     return String.format("%-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%" + n + "s", s);  
}

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}

Et le résultat est :

Howto               *
               Howto*

49 votes

Et si vous avez besoin de lpad avec d'autres caractères (pas des espaces) ? Est-ce encore possible avec String.format ? Je n'arrive pas à le faire fonctionner...

6 votes

AFAIK String.format() ne peut pas le faire mais il n'est pas trop difficile de le coder, cf. rgagnon.com/javadetails/java-0448.html (2ème exemple)

62 votes

@Nullw0rm, si vous faites référence à rgagnon.com, sachez que RealHowTo est l'auteur de rgagnon.com aussi, donc il s'attribuerait le mérite...

297voto

leo Points 1257

Rembourrage jusqu'à 10 caractères :

String.format("%10s", "foo").replace(' ', '*');
String.format("%-10s", "bar").replace(' ', '*');
String.format("%10s", "longer than 10 chars").replace(' ', '*');

sortie :

  *******foo
  bar*******
  longer*than*10*chars

Afficher '*' pour les caractères du mot de passe :

String password = "secret123";
String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');

La sortie a la même longueur que la chaîne de mots de passe :

  secret123
  *********

61 votes

Tant que nous nous souvenons tous de ne pas passer dans une chaîne de caractères avec des espaces... :D

5 votes

Je suis avec @aboveyou00 - c'est une solution horrible pour les chaînes avec des espaces, y compris l'exemple fourni par leo. Une solution de remplissage d'une chaîne à gauche ou à droite ne devrait pas modifier la chaîne d'entrée telle qu'elle apparaît dans la sortie, à moins que le remplissage original de la chaîne d'entrée ne la fasse dépasser la longueur de remplissage spécifiée.

3 votes

Reconnaissez le problème de l'espace. .replace(' ', '*') était plutôt destiné à montrer l'effet du rembourrage. L'expression "cacher le mot de passe" n'a pas ce problème de toute façon... Pour une meilleure réponse sur la personnalisation des chaînes de remplissage gauche et droite à l'aide d'une fonctionnalité Java native, voir mon autre réponse.

211voto

GaryF Points 11921

Apache StringUtils a plusieurs méthodes : leftPad , rightPad , center y repeat .

Mais notez bien que - comme d'autres l'ont mentionné et démontré en cette réponse - String.format() et le Formatter dans le JDK sont de meilleures options. Utilisez-les plutôt que le code commun.

105 votes

Java.util.Formatter (et String.format()) fait cela. Il faut toujours préférer le JDK à une bibliothèque externe si la version du JDK fait le travail (ce qui est le cas).

6 votes

Pour plusieurs raisons, je préfère maintenant Guava à Apache Commons ; cette réponse montre comment le faire en Guava .

1 votes

@Jonik pourriez-vous énumérer certaines de vos raisons ? Les API sont à peu près les mêmes.

87voto

Garrett Hall Points 11902

En Goyave c'est facile :

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');

2 votes

Ajouter 2.7MB de dépendance de code pour un simple padding qui est déjà inclus dans le JDK standard ? Sérieusement.

22voto

Miserable Variable Points 17515

Outre Apache Commons, voir aussi String.format qui devrait être capable de prendre en charge le simple remplissage (par exemple avec des espaces).

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