1226 votes

Remplissage à gauche des entiers avec des zéros en Java

Comment ajouter des zéros à un nombre entier en java lors de la conversion en chaîne de caractères ?

Je cherche essentiellement à remplir les entiers jusqu'à 9999 avec les zéros de tête.

Par exemple, 1 = "0001".

Je sais que c'est probablement simple et qu'en tant que tâche parallèle, je suis en train de le googler, mais SO est super rapide quand il s'agit de questions ineptes dont je devrais connaître la réponse....

2 votes

Ouaip, c'est ça ! C'est ma faute... Je l'ai tapé sur mon téléphone. Vous n'avez pas besoin de la "nouvelle chaîne" non plus : Integer.toString(num+10000).subString(1) fonctionne.

0 votes

Long.valueOf("00003400").toString(); Integer.valueOf("00003400").toString(); --->3400

1 votes

Voir aussi stackoverflow.com/questions/35521278/ pour une solution avec diagramme

1968voto

Yoni Roit Points 11338
String.format("%05d", yournumber);

pour le zéro-padding avec longueur=5.

http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html

1 votes

Dois-je m'attendre à ce que les options de String.format pour s'apparenter à printf() en C ?

18 votes

Si vous devez faire cela pour une grande liste de valeurs, les performances de DecimalFormat sont au moins 3 fois meilleures que celles de String.format(). Je suis en train de procéder moi-même à un ajustement des performances et l'exécution des deux dans Visual VM montre que la méthode String.format() accumule du temps CPU à un rythme 3-4 fois supérieur à celui de DecimalFormat.format().

0 votes

@Shurane principalement, oui.

123voto

Boris Pavlović Points 22207

Si, pour une raison quelconque, vous utilisez un Java antérieur à la version 1.5, vous pouvez essayer la méthode Apache Commons Lang.

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

36voto

Omar Kooheji Points 14073

J'ai trouvé cet exemple... Je vais le tester...

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));
    }
}

Je l'ai testé et :

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

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

A la vôtre.

1 votes

Oui, j'allais suggérer DecimalFormat parce que je ne connaissais pas String.format, mais ensuite j'ai vu la réponse d'uzhin. String.format doit être nouveau.

0 votes

C'est similaire à ce que vous feriez en .Net, sauf que la méthode .Net est plus agréable pour les petits nombres.

0 votes

Dans mon cas, j'ai utilisé la première option (DecimalFormat) parce que mon nombre était un double.

23voto

das Keks Points 469

Si les performances sont importantes dans votre cas, vous pouvez le faire vous-même en réduisant les frais généraux par rapport au système de gestion de la qualité. String.format fonction :

/**
 * @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

2 votes

Plus haut, il est mentionné que l'utilisation de DecimalFormat est plus rapide. Avez-vous des remarques à ce sujet ?

0 votes

@Patrick Pour les performances du DecimalFormat, voir aussi : stackoverflow.com/questions/8553672/

0 votes

C'est choquant ! C'est fou que la fonction fonctionne si mal. Je devais mettre à zéro et afficher une collection d'ints non signés pouvant aller de 1 à 3 chiffres. Cela 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 n'ai pas chronométré !).

3voto

BrainDead Points 188
int x = 1;
System.out.format("%05d",x);

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

2 votes

Mais OP ne l'a jamais demandé. Internally String.format y System.out.format appeler le même java.util.Formatter mise en œuvre.

0 votes

... et System.out peut être redirigé.

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