web-dev-qa-db-fra.com

Rembourrage gauche d'une chaîne avec des zéros

J'ai vu des questions similaires ici et ici .

Mais je ne suis pas en train de comprendre comment envelopper une chaîne avec Zero.

entrée: "129018" sortie: "0000129018"

La longueur totale de sortie doit être TEN.

232
jai

Si votre chaîne ne contient que des nombres, vous pouvez en faire un entier puis effectuer un remplissage:

String.format("%010d", Integer.parseInt(mystring));

Sinon je voudrais savoir comment cela peut être fait .

334
khachik
String paddedString = org.Apache.commons.lang.StringUtils.leftPad("129018", 10, "0")

le second paramètre est la longueur de sortie souhaitée

"0" est le caractère de remplissage

135
Oliver Michels

Ceci remplira n'importe quelle chaîne d'une largeur totale de 10 sans se soucier des erreurs d'analyse:

String unpadded = "12345"; 
String padded = "##########".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "#####12345"

Si vous voulez bien jouer:

String unpadded = "12345"; 
String padded = unpadded + "##########".substring(unpadded.length());

//unpadded is "12345"
//padded   is "12345#####"  

Vous pouvez remplacer les caractères "#" par le caractère que vous souhaitez utiliser, en répétant le nombre de fois que vous souhaitez définir la largeur totale de la chaîne. Par exemple. si vous souhaitez ajouter des zéros à gauche de manière à ce que la chaîne entière comprenne 15 caractères:

String unpadded = "12345"; 
String padded = "000000000000000".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "000000000012345"  

L'avantage de cette réponse par rapport à khachik est que cela n'utilise pas Integer.parseInt, ce qui peut générer une exception (par exemple, si le nombre que vous souhaitez tamponner est trop grand, comme 12147483647). L'inconvénient est que si ce que vous remplissez est déjà un int, vous devrez le convertir en chaîne, ce qui n'est pas souhaitable.

Donc, si vous savez avec certitude qu'il s'agit d'un int, la réponse de khatchik fonctionne très bien. Sinon, c'est une stratégie possible.

100
Rick Hanlon II
String str = "129018";
StringBuilder sb = new StringBuilder();

for (int toPrepend=10-str.length(); toPrepend>0; toPrepend--) {
    sb.append('0');
}

sb.append(str);
String result = sb.toString();
51
thejh
String str = "129018";
String str2 = String.format("%10s", str).replace(' ', '0');
System.out.println(str2);
49
Satish
14
thk

Pour formater une chaîne, utilisez

import org.Apache.commons.lang.StringUtils;

public class test {

    public static void main(String[] args) {

        String result = StringUtils.leftPad("wrwer", 10, "0");
        System.out.println("The String : " + result);

    }
}

Sortie: La chaîne: 00000wrwer

Lorsque le premier argument est la chaîne à formater, le second argument correspond à la longueur de la longueur de sortie souhaitée et le troisième argument correspond au caractère avec lequel la chaîne doit être complétée.

Utilisez le lien pour télécharger le pot http://commons.Apache.org/proper/commons-lang/download_lang.cgi

13
Nagarajan S R

Si vous avez besoin de performances et que vous connaissez la taille maximale de la chaîne, utilisez ceci:

String zeroPad = "0000000000000000";
String str0 = zeroPad.substring(str.length()) + str;

Soyez conscient de la taille maximale de la chaîne. S'il est plus grand que la taille du StringBuffer, vous aurez un Java.lang.StringIndexOutOfBoundsException.

10
Haroldo Macedo

Utilisez Google Guava :

Maven:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

Exemple de code:

Strings.padStart("129018", 10, '0') returns "0000129018"  
4
Tho

Une vieille question, mais j'ai aussi deux méthodes.


Pour une longueur fixe (prédéfinie):

    public static String fill(String text) {
        if (text.length() >= 10)
            return text;
        else
            return "0000000000".substring(text.length()) + text;
    }

Pour une longueur variable:

    public static String fill(String text, int size) {
        StringBuilder builder = new StringBuilder(text);
        while (builder.length() < size) {
            builder.append('0');
        }
        return builder.toString();
    }
4
Carlos Heuberger

Je préfère ce code:

public final class StrMgr {

    public static String rightPad(String input, int length, String fill){                   
        String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
        return pad.substring(0, length);              
    }       

    public static String leftPad(String input, int length, String fill){            
        String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
        return pad.substring(pad.length() - length, pad.length());
    }
}

puis:

System.out.println(StrMgr.leftPad("hello", 20, "x")); 
System.out.println(StrMgr.rightPad("hello", 20, "x"));
3
strobering

Basé sur @ la réponse de Haroldo Macêdo , j'ai créé une méthode dans ma classe personnalisée Utils telle que

/**
 * Left padding a string with the given character
 *
 * @param str     The string to be padded
 * @param length  The total fix length of the string
 * @param padChar The pad character
 * @return The padded string
 */
public static String padLeft(String str, int length, String padChar) {
    String pad = "";
    for (int i = 0; i < length; i++) {
        pad += padChar;
    }
    return pad.substring(str.length()) + str;
}

Puis appelez Utils.padLeft(str, 10, "0");

2
Sithu

Voici une autre approche:

int pad = 4;
char[] temp = (new String(new char[pad]) + "129018").toCharArray()
Arrays.fill(temp, 0, pad, '0');
System.out.println(temp)
2
nullpotent

Voici ma solution:

String s = Integer.toBinaryString(5); //Convert decimal to binary
int p = 8; //preferred length
for(int g=0,j=s.length();g<p-j;g++, s= "0" + s);
System.out.println(s);

Sortie: 000101

2
sh3r1

La solution de Satish est très bonne parmi les réponses attendues. Je voulais le rendre plus général en ajoutant la variable n à la chaîne de format au lieu de 10 caractères.

int maxDigits = 10;
String str = "129018";
String formatString = "%"+n+"s";
String str2 = String.format(formatString, str).replace(' ', '0');
System.out.println(str2);

Cela fonctionnera dans la plupart des situations

1
Prabhu

Rembourrage droit avec longueur fixe-10: String.format ("% 1 $ -10s", "abc") Rembourrage gauche avec longueur fixe-10: String.format ("% 1 $ 10s", "abc")

1
Arun

Voici une solution basée sur String.format qui fonctionnera pour les chaînes et convient aux longueurs variables.

public static String PadLeft(String stringToPad, int padToLength){
    String retValue = null;
    if(stringToPad.length() < padToLength) {
        retValue = String.format("%0" + String.valueOf(padToLength - stringToPad.length()) + "d%s",0,stringToPad);
    }
    else{
        retValue = stringToPad;
    }
    return retValue;
}

public static void main(String[] args) {
    System.out.println("'" + PadLeft("test", 10) + "'");
    System.out.println("'" + PadLeft("test", 3) + "'");
    System.out.println("'" + PadLeft("test", 4) + "'");
    System.out.println("'" + PadLeft("test", 5) + "'");
}

Sortie: '000000test' 'test' 'test' '0test'

0
P.V.M. Kessels
    int number = -1;
    int holdingDigits = 7;
    System.out.println(String.format("%0"+ holdingDigits +"d", number));

Juste demandé cela dans une interview ........

Ma réponse ci-dessous mais ceci (mentionné ci-dessus) est beaucoup plus agréable->

String.format("%05d", num);

Ma réponse est:

static String leadingZeros(int num, int digitSize) {
    //test for capacity being too small.

    if (digitSize < String.valueOf(num).length()) {
        return "Error : you number  " + num + " is higher than the decimal system specified capacity of " + digitSize + " zeros.";

        //test for capacity will exactly hold the number.
    } else if (digitSize == String.valueOf(num).length()) {
        return String.valueOf(num);

        //else do something here to calculate if the digitSize will over flow the StringBuilder buffer Java.lang.OutOfMemoryError 

        //else calculate and return string
    } else {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < digitSize; i++) {
            sb.append("0");
        }
        sb.append(String.valueOf(num));
        return sb.substring(sb.length() - digitSize, sb.length());
    }
}
0
bockymurphy

Vérifiez mon code qui fonctionnera pour integer et String.

Supposons que notre premier numéro est 129018. Et nous voulons ajouter des zéros afin que la longueur de la chaîne finale soit de 10. Pour cela, vous pouvez utiliser le code suivant

    int number=129018;
    int requiredLengthAfterPadding=10;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);
0
Fathah Rehman P