Comment puis-je pad une chaîne en Java?


Existe-t-il un moyen facile de tamponner des chaînes en Java?

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

Author: Jason Plank, 2008-12-23

26 answers

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

, Mais veuillez noter que comme d'autres l'ont mentionné et illustré dans cette réponse - String.format() et la Formatter les classes du JDK sont de meilleures options. Utilisez-les sur le code commons.

 149
Author: GaryF, 2018-06-23 22:09:29

Depuis Java 1.5, String.format() peut être utilisé à gauche/droite pad d'une chaîne donnée.

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

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

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}
/*
  output :
     Howto               *
                    Howto*
*/
 549
Author: RealHowTo, 2017-09-11 20:09:01

Remplissage à 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 mot de passe:

  secret123
  *********
 230
Author: leo, 2011-05-31 09:13:08

Dans Goyave, c'est facile:

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
 84
Author: Garrett Hall, 2011-09-21 15:56:44

Quelque Chose de simple:

La valeur doit être une chaîne. convertissez - le en chaîne, si ce n'est pas le cas. Comme "" + 123 ou Integer.toString(123)

// let's assume value holds the String we want to pad
String value = "123";

La sous-chaîne commence à partir de la valeur length char index jusqu'à la fin length of padded:

String padded="00000000".substring(value.length()) + value;

// now padded is "00000123"

Plus précis

Pavé droit:

String padded = value + ("ABCDEFGH".substring(value.length())); 

// now padded is "123DEFGH"

Pad gauche:

String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;

// now padded is "ABCDE123"
 29
Author: Shimon Doodkin, 2016-06-02 13:44:06

Jetez un oeil à org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar).

Mais l'algorithme est très simple (pad jusqu'à la taille des caractères):

public String pad(String str, int size, char padChar)
{
  StringBuffer padded = new StringBuffer(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}
 22
Author: Arne Burmeister, 2008-12-23 09:24:38

Outre Apache Commons, voir aussi String.format qui devrait pouvoir prendre en charge un remplissage simple (par exemple avec des espaces).

 21
Author: Miserable Variable, 2008-12-23 09:24:20
public static String LPad(String str, Integer length, char car) {
  return str
         + 
         String.format("%" + (length - str.length()) + "s", "")
                     .replace(" ", String.valueOf(car));
}

public static String RPad(String str, Integer length, char car) {
  return String.format("%" + (length - str.length()) + "s", "")
               .replace(" ", String.valueOf(car)) 
         +
         str;
}

LPad("Hi", 10, 'R') //gives "RRRRRRRRHi"
RPad("Hi", 10, 'R') //gives "HiRRRRRRRR"
RPad("Hi", 10, ' ') //gives "Hi        "
//etc...
 14
Author: Eduardo, 2012-02-10 07:48:54

Cela m'a pris un peu de temps pour comprendre. La vraie clé est de lire cette documentation du formateur.

// Get your data from wherever.
final byte[] data = getData();
// Get the digest engine.
final MessageDigest md5= MessageDigest.getInstance("MD5");
// Send your data through it.
md5.update(data);
// Parse the data as a positive BigInteger.
final BigInteger digest = new BigInteger(1,md5.digest());
// Pad the digest with blanks, 32 wide.
String hex = String.format(
    // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
    // Format: %[argument_index$][flags][width]conversion
    // Conversion: 'x', 'X'  integral    The result is formatted as a hexadecimal integer
    "%1$32x",
    digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);
 7
Author: Nthalk, 2010-10-29 20:58:09

Je sais que ce thread est un peu vieux et que la question d'origine était une solution facile, mais s'il est censé être très rapide, vous devriez utiliser un tableau de caractères.

public static String pad(String str, int size, char padChar)
{
    if (str.length() < size)
    {
        char[] temp = new char[size];
        int i = 0;

        while (i < str.length())
        {
            temp[i] = str.charAt(i);
            i++;
        }

        while (i < size)
        {
            temp[i] = padChar;
            i++;
        }

        str = new String(temp);
    }

    return str;
}

La solution du formateur n'est pas optimale. la simple construction de la chaîne de format crée 2 nouvelles chaînes.

La solution d'Apache peut être améliorée en initialisant le sb avec la taille cible afin de remplacer ci-dessous

StringBuffer padded = new StringBuffer(str); 

Avec

StringBuffer padded = new StringBuffer(pad); 
padded.append(value);

Empêcherait le tampon interne du sb de croître.

 6
Author: ck., 2010-10-28 14:34:48

Voici une autre façon de pad à droite:

// put the number of spaces, or any character you like, in your paddedString

String paddedString = "--------------------";

String myStringToBePadded = "I like donuts";

myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length());

//result:
myStringToBePadded = "I like donuts-------";
 5
Author: fawsha1, 2011-09-21 17:40:38

Vous pouvez réduire la surcharge par appel en conservant les données de remplissage, plutôt que de les reconstruire à chaque fois:

public class RightPadder {

    private int length;
    private String padding;

    public RightPadder(int length, String pad) {
        this.length = length;
        StringBuilder sb = new StringBuilder(pad);
        while (sb.length() < length) {
            sb.append(sb);
        }
        padding = sb.toString();
   }

    public String pad(String s) {
        return (s.length() < length ? s + padding : s).substring(0, length);
    }

}

Comme alternative, vous pouvez faire de la longueur du résultat un paramètre de la méthode pad(...). Dans ce cas, effectuez l'ajustement du remplissage caché dans cette méthode au lieu de dans le constructeur.

(Indice: Pour un crédit supplémentaire, faites-le thread-safe! ;-)

 4
Author: joel.neely, 2008-12-23 14:25:42

Vous pouvez utiliser les méthodes intégrées StringBuilder append() et insert() , pour le remplissage de longueurs de chaîne variables:

AbstractStringBuilder append(CharSequence s, int start, int end) ;

Par exemple:

private static final String  MAX_STRING = "                    "; //20 spaces

    Set<StringBuilder> set= new HashSet<StringBuilder>();
    set.add(new StringBuilder("12345678"));
    set.add(new StringBuilder("123456789"));
    set.add(new StringBuilder("1234567811"));
    set.add(new StringBuilder("12345678123"));
    set.add(new StringBuilder("1234567812234"));
    set.add(new StringBuilder("1234567812222"));
    set.add(new StringBuilder("12345678122334"));

    for(StringBuilder padMe: set)
        padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());
 2
Author: ef_oren, 2010-08-24 10:55:49

Cela fonctionne:

"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")

Il remplira votre chaîne XXX jusqu'à 9 Caractères avec un espace. Après cela, tous les espaces blancs seront remplacés par un 0. Vous pouvez changer les espaces et le 0 à ce que vous voulez...

 2
Author: Sebastian S., 2011-05-11 14:30:17
public static String padLeft(String in, int size, char padChar) {                
    if (in.length() <= size) {
        char[] temp = new char[size];
        /* Llenado Array con el padChar*/
        for(int i =0;i<size;i++){
            temp[i]= padChar;
        }
        int posIniTemp = size-in.length();
        for(int i=0;i<in.length();i++){
            temp[posIniTemp]=in.charAt(i);
            posIniTemp++;
        }            
        return new String(temp);
    }
    return "";
}
 2
Author: Marlon Tarax, 2011-08-24 17:36:51

Laissez-moi une réponse pour certains cas où vous devez donner un remplissage gauche/droite (ou une chaîne de préfixe/suffixe ou des espaces) avant de concaténer à une autre chaîne et vous ne voulez pas tester la longueur ou toute condition if.

La même chose à la réponse sélectionnée, je préférerais leStringUtils d'Apache Commons mais en utilisant de cette façon:

StringUtils.defaultString(StringUtils.leftPad(myString, 1))

Expliquer:

  • myString : la chaîne que j'ai entrée peut être nulle
  • StringUtils.leftPad(myString, 1): si string vaut null, cette instruction retournera null aussi
  • , puis utilisez defaultString pour donner une chaîne vide pour éviter concaténer null
 2
Author: Osify, 2016-08-29 13:37:21

Trouvé ceci sur Dzone

Pad avec des zéros:

String.format("|%020d|", 93); // prints: |00000000000000000093|
 2
Author: OJVM, 2017-10-26 19:20:30

java.util.Formatter fera le rembourrage gauche et droit. Pas besoin de dépendances tierces étranges (voudriez-vous les ajouter pour quelque chose de si trivial).

[J'ai laissé de côté les détails et fait de ce post 'community wiki' car ce n'est pas quelque chose dont j'ai besoin.]

 1
Author: Tom Hawtin - tackline, 2008-12-23 14:58:42

@les réponses de ck et @Marlon Tarak sont les seules à utiliser un char[], ce qui pour les applications qui ont plusieurs appels à des méthodes de remplissage par seconde est la meilleure approche. Cependant, ils ne profitent d'aucune optimisation de manipulation de tableau et sont un peu écrasés à mon goût; cela peut être fait avec pas de boucles du tout.

public static String pad(String source, char fill, int length, boolean right){
    if(source.length() > length) return source;
    char[] out = new char[length];
    if(right){
        System.arraycopy(source.toCharArray(), 0, out, 0, source.length());
        Arrays.fill(out, source.length(), length, fill);
    }else{
        int sourceOffset = length - source.length();
        System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length());
        Arrays.fill(out, 0, sourceOffset, fill);
    }
    return new String(out);
}

Méthode d'essai simple:

public static void main(String... args){
    System.out.println("012345678901234567890123456789");
    System.out.println(pad("cats", ' ', 30, true));
    System.out.println(pad("cats", ' ', 30, false));
    System.out.println(pad("cats", ' ', 20, false));
    System.out.println(pad("cats", '$', 30, true));
    System.out.println(pad("too long for your own good, buddy", '#', 30, true));
}

Sorties:

012345678901234567890123456789
cats                          
                          cats
                cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy 
 1
Author: ndm13, 2017-07-11 20:45:37

Utilisez cette fonction.

private String leftPadding(String word, int length, char ch) {
   return (length > word.length()) ? leftPadding(ch + word, length, ch) : word;
}

Comment utiliser?

leftPadding(month, 2, '0');

Sortie: 01 02 03 04 .. 11 12

 1
Author: Samet öztoprak, 2017-12-02 09:51:56

Une solution simple sans API sera la suivante:

public String pad(String num, int len){
    if(len-num.length() <=0) return num;
    StringBuffer sb = new StringBuffer();
    for(i=0; i<(len-num.length()); i++){
        sb.append("0");
    }
    sb.append(num);
    return sb.toString();
}
 0
Author: Shashank Shekhar, 2017-05-17 13:07:34

Java oneliners, pas de bibliothèque de fantaisie.

// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"

Pad gauche, ne limitez pas

result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"

Pad Droit, ne limitez pas

result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"

Pad gauche, limite à la longueur du pad

result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"

Pad Droit, limite à pad longueur

result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"
 0
Author: leo, 2017-08-31 21:49:38

Toutes les opérations stringdoivent généralement être très efficaces - surtout si vous travaillez avec de gros ensembles de données. Je voulais quelque chose de rapide et flexible, similaire à ce que vous obtiendrez dans la commande plsql pad. De plus, je ne veux pas inclure une énorme bibliothèque pour une seule petite chose. Compte tenu de ces considérations, aucune de ces solutions n'était satisfaisante. Ce sont les solutions que j'ai proposées, qui ont eu les meilleurs résultats de benchmarking, si quelqu'un peut l'améliorer, veuillez ajouter votre commentaire.

public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) {
    if (pStringChar.length < pTotalLength) {
        char[] retChar = new char[pTotalLength];
        int padIdx = pTotalLength - pStringChar.length;
        Arrays.fill(retChar, 0, padIdx, pPad);
        System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length);
        return retChar;
    } else {
        return pStringChar;
    }
}
  • note il est appelé avec une chaîne.toCharArray() et le résultat peut être converti en chaîne avec new String ((char[])result). La raison en est que si vous appliquez plusieurs opérations, vous pouvez toutes les faire sur char[] et ne pas continuer à convertir entre les formats - dans les coulisses, String est stocké en tant que char[]. Si ces opérations étaient incluses dans la classe String elle - même, cela aurait été deux fois plus efficace-vitesse et mémoire.
 0
Author: EarlB, 2017-09-14 07:25:35

Beaucoup de gens ont des techniques très intéressantes mais j'aime garder les choses simples alors je vais avec ceci:

public static String padRight(String s, int n, char padding){
    StringBuilder builder = new StringBuilder(s.length() + n);
    builder.append(s);
    for(int i = 0; i < n; i++){
        builder.append(padding);
    }
    return builder.toString();
}

public static String padLeft(String s, int n,  char padding) {
    StringBuilder builder = new StringBuilder(s.length() + n);
    for(int i = 0; i < n; i++){
        builder.append(Character.toString(padding));
    }
    return builder.append(s).toString();
}

public static String pad(String s, int n, char padding){
    StringBuilder pad = new StringBuilder(s.length() + n * 2);
    StringBuilder value = new StringBuilder(n);
    for(int i = 0; i < n; i++){
        pad.append(padding);
    }
    return value.append(pad).append(s).append(pad).toString();
}
 0
Author: Aelphaeis, 2018-06-17 15:24:41

Une solution simple serait:

package nl;
public class Padder {
    public static void main(String[] args) {
        String s = "123" ;
        System.out.println("#"+("     " + s).substring(s.length())+"#");
    }
}
 -1
Author: Hans Andeweg, 2012-01-19 12:24:53

Comment est-ce

String est " hello "et le remplissage requis est 15 avec" 0 " pad gauche

String ax="Hello";
while(ax.length() < 15) ax="0"+ax;
 -2
Author: Satwant, 2013-03-28 11:53:39