Comment puis-je remplir un entier avec des zéros à gauche?

1022

Comment avez-vous laissé un pad intavec des zéros lors de la conversion Stringen Java?

Je cherche essentiellement à remplir les entiers 9999avec des zéros non significatifs (par exemple 1 = 0001).

Omar Kooheji
la source
2
Ouais, c'est ça! mon mauvais ... je l'ai tapé sur mon téléphone. Vous n'avez pas non plus besoin de la "nouvelle chaîne": Integer.toString (num + 10000) .subString (1) fonctionne.
Randyaa
Long.valueOf ("00003400"). ToString (); Integer.valueOf ("00003400"). ToString (); ---> 3400
frekele
1
voir aussi stackoverflow.com/questions/35521278/… pour une solution avec diagramme
bvdb
Il y a cependant un problème avec l' new String(Integer.toString(num + 10000)).substring(1)approche if qui numest supérieure à 9999, ijs.
Felype

Réponses:

1697

Utilisez java.lang.String.format(String,Object...)comme ceci:

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

pour un remplissage nul avec une longueur de 5. Pour une sortie hexadécimale, remplacez le dpar un xcomme dans "%05x".

Les options de formatage complètes sont documentées dans le cadre de java.util.Formatter.

Yoni Roit
la source
1
Dois-je m'attendre à ce que les options String.formatde s'apparentent à printf () en C?
Ehtesh Choudhury
13
Si vous devez le faire pour une grande liste de valeurs, les performances de DecimalFormat sont au moins 3 fois meilleures que String.format (). Je suis en train de faire moi-même un ajustement des performances et d'exécuter les deux dans Visual VM montre la méthode String.format () accumulant le temps CPU à environ 3-4 fois le taux de DecimalFormat.format ().
Steve Ferguson
10
Et pour ajouter plus de 9 zéros, utilisez quelque chose comme%012d
Mohammad Banisaeid
2
C'est pour Java 5 et supérieur. Pour la version 1.4 et inférieure, DecimalFormat est une alternative comme indiqué ici javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
1
Salut les gars! J'ai des problèmes avec:%d can't format java.lang.String arguments
Helio Soares Junior
116

Disons que vous voulez imprimer 11en011

Vous pouvez utiliser un formatter : "%03d".

entrez la description de l'image ici

Vous pouvez utiliser ce formateur comme ceci:

int a = 11;
String with3digits = String.format("%03d", a);
System.out.println(with3digits);

Alternativement, certaines méthodes java prennent directement en charge ces formateurs:

System.out.printf("%03d", a);
bvdb
la source
5
@Omar Koohei en effet, mais cela explique le raisonnement derrière les "constantes magiques".
bvdb
Bonne réponse! Juste un commentaire, le Fformat () doit être f: String.format(...);.
David Miguel
que faire si je ne veux pas ajouter un 0 en tête mais une autre lettre / chiffre? merci
chiperortiz
1
@chiperortiz afaik ce n'est pas possible avec les outils de formatage ci-dessus. Dans ce cas, je calcule les premiers caractères requis (par exemple int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), puis j'utilise une méthode de chaîne de répétition pour créer le préfixe requis. Il existe différentes façons de répéter des chaînes, mais il n'y en a pas de natif java, afaik: stackoverflow.com/questions/1235179/…
bvdb
114

Si pour quelque raison que ce soit, vous utilisez Java 1.5, vous pouvez essayer avec la méthode Apache Commons Lang

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')
Boris Pavlović
la source
29

Trouvé cet exemple ... Testera ...

import java.text.DecimalFormat;
class TestingAndQualityAssuranceDepartment
{
    public static void main(String [] args)
    {
        int x=1;
        DecimalFormat df = new DecimalFormat("00");
        System.out.println(df.format(x));
    }
}

Testé cela et:

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

Les deux fonctionnent, pour moi, je pense que String.Format est meilleur et plus succinct.

Omar Kooheji
la source
1
Oui, j'allais suggérer DecimalFormat parce que je ne connaissais pas String.format, mais j'ai ensuite vu la réponse d'uzhin. String.format doit être nouveau.
Paul Tomblin
C'est similaire à la façon dont vous le feriez dans .Net Sauf que la manière .Net semble plus agréable pour les petits nombres.
Omar Kooheji du
Dans mon cas, j'ai utilisé la première option (DecimalFormat) car mon numéro était un Double
mauronet
21

Si les performances sont importantes dans votre cas, vous pouvez le faire vous-même avec moins de frais généraux par rapport à la String.formatfonction:

/**
 * @param in The integer value
 * @param fill The number of digits to fill
 * @return The given value left padded with the given number of digits
 */
public static String lPadZero(int in, int fill){

    boolean negative = false;
    int value, len = 0;

    if(in >= 0){
        value = in;
    } else {
        negative = true;
        value = - in;
        in = - in;
        len ++;
    }

    if(value == 0){
        len = 1;
    } else{         
        for(; value != 0; len ++){
            value /= 10;
        }
    }

    StringBuilder sb = new StringBuilder();

    if(negative){
        sb.append('-');
    }

    for(int i = fill; i > len; i--){
        sb.append('0');
    }

    sb.append(in);

    return sb.toString();       
}

Performance

public static void main(String[] args) {
    Random rdm;
    long start; 

    // Using own function
    rdm = new Random(0);
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        lPadZero(rdm.nextInt(20000) - 10000, 4);
    }
    System.out.println("Own function: " + ((System.nanoTime() - start) / 1000000) + "ms");

    // Using String.format
    rdm = new Random(0);        
    start = System.nanoTime();

    for(int i = 10000000; i != 0; i--){
        String.format("%04d", rdm.nextInt(20000) - 10000);
    }
    System.out.println("String.format: " + ((System.nanoTime() - start) / 1000000) + "ms");
}

Résultat

Fonction propre: 1697ms

String.format: 38134ms

das Keks
la source
1
Ci-dessus, il est mentionné que DecimalFormat est plus rapide. Aviez-vous des notes à ce sujet?
Patrick
@Patrick Pour les performances DecimalFormat, voir aussi: stackoverflow.com/questions/8553672/…
Stephan
Choquant! Ce sont des noix qui fonctionnent si mal. J'ai dû mettre à zéro et afficher une collection d'entiers non signés pouvant aller de 1 à 3 chiffres. Il devait fonctionner à la vitesse de l'éclair. J'ai utilisé cette méthode simple: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";cela a fonctionné très rapidement (désolé, je ne l'ai pas chronométré!).
BuvinJ
Comment les performances se comparent-elles une fois qu'elles ont été suffisamment exécutées pour que HotSpot ait une fissure?
Phil
16

Vous pouvez utiliser Google Guava :

Maven:

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

Exemple de code:

String paddedString1 = Strings.padStart("7", 3, '0'); //"007"
String paddedString2 = Strings.padStart("2020", 3, '0'); //"2020"

Remarque:

Guavaest une bibliothèque très utile, il fournit également de nombreuses fonctionnalités qui se rapportent à Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, etc.

Réf: GuavaExplained

Tho
la source
1
L'exemple de code ci-dessus concerne uniquement l'utilisation, pas vraiment un exemple de code. Le commentaire reflète cela, vous auriez besoin de "String myPaddedString = Strings.padStart (...)"
JoeG
2
Cette méthode donne en fait de bien meilleurs résultats que JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag
10

Essaye celui-là:

import java.text.DecimalFormat; 

DecimalFormat df = new DecimalFormat("0000");
String c = df.format(9);   // 0009
String a = df.format(99);  // 0099
String b = df.format(999); // 0999
Brijesh Patel
la source
3

Bien que la plupart des approches ci-dessus soient bonnes, nous devons parfois formater des entiers ainsi que des flottants. Nous pouvons l'utiliser, en particulier lorsque nous devons remplir un nombre particulier de zéros à gauche ainsi qu'à droite des nombres décimaux.

import java.text.NumberFormat;  
public class NumberFormatMain {  

public static void main(String[] args) {  
    int intNumber = 25;  
    float floatNumber = 25.546f;  
    NumberFormat format=NumberFormat.getInstance();  
    format.setMaximumIntegerDigits(6);  
    format.setMaximumFractionDigits(6);  
    format.setMinimumFractionDigits(6);  
    format.setMinimumIntegerDigits(6);  

    System.out.println("Formatted Integer : "+format.format(intNumber).replace(",",""));  
    System.out.println("Formatted Float   : "+format.format(floatNumber).replace(",",""));  
 }    
}  
Deepak
la source
2
int x = 1;
System.out.format("%05d",x);

si vous souhaitez imprimer le texte formaté directement sur l'écran.

Shashi
la source
1
Mais OP ne l'a jamais demandé. En interne String.formatet System.out.formatappelez la même java.util.Formatterimplémentation.
bsd
... et System.out peuvent être redirigés.
Phil
1

Utilisez la classe DecimalFormat, comme ceci:

NumberFormat formatter = new DecimalFormat("0000"); //i use 4 Zero but you can also another number
System.out.println("OUTPUT : "+formatter.format(811)); 

SORTIE: 0000811

Shomu
la source
1

Voici comment formater votre chaîne sans utiliser DecimalFormat.

String.format("%02d", 9)

09

String.format("%03d", 19)

019

String.format("%04d", 119)

0119

Morgan Koh
la source
0

Vérifiez mon code qui fonctionnera pour l'entier et la chaîne.

Supposons que notre premier nombre soit 2. Et nous voulons ajouter des zéros à cela pour que la longueur de la chaîne finale soit 4. Pour cela, vous pouvez utiliser le code suivant

    int number=2;
    int requiredLengthAfterPadding=4;
    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);
Fathah Rehman P
la source
(new char[diff])pourquoi
Isaac
replace("\0", "0")qu'est-ce que ... quoi
Isaac
@Isaac - J'ai d'abord créé un tableau de caractères, et en utilisant ce tableau de caractères, j'ai créé une chaîne. Ensuite, j'ai remplacé le caractère nul (qui est la valeur par défaut du type char) par "0" (qui est le caractère dont nous avons besoin ici pour le remplissage)
Fathah Rehman P
0

Vous devez utiliser un formateur, le code suivant utilise NumberFormat

    int inputNo = 1;
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMaximumIntegerDigits(4);
    nf.setMinimumIntegerDigits(4);
    nf.setGroupingUsed(false);

    System.out.println("Formatted Integer : " + nf.format(inputNo));

Sortie: 0001

JoBⅈN
la source
-2
public static String zeroPad(long number, int width) {
   long wrapAt = (long)Math.pow(10, width);
   return String.valueOf(number % wrapAt + wrapAt).substring(1);
}

Le seul problème avec cette approche est qu'elle vous oblige à mettre votre chapeau de réflexion pour comprendre comment cela fonctionne.

johncurrier
la source
5
Le seul problème? Essayez-le avec un négatif numberou avec un widthsupérieur à 18.
user85421
2
Bon point. Et je suppose qu'il fait plus que ce qui était demandé car il tronque en largeur (ce qui n'était pas explicitement demandé mais est généralement nécessaire). C'est dommage que Java (douloureusement lent en comparaison) String.format () ne supporte pas les largeurs variables et ne supporte pas du tout la précision pour les spécificateurs entiers.
johncurrier
-3

Aucun package requis:

String paddedString = i < 100 ? i < 10 ? "00" + i : "0" + i : "" + i;

Cela remplira la chaîne de trois caractères, et il est facile d'ajouter une partie supplémentaire pour quatre ou cinq. Je sais que ce n'est en aucun cas la solution parfaite (surtout si vous voulez une grosse corde rembourrée), mais j'aime ça.

NoShadowKick
la source
1
Hmm ... j'aime ça.
Kartik Chugh