Come posso riempire un numero intero con zeri a sinistra?


1022

Come hai lasciato pad an intcon zero durante la conversione in a Stringin java?

Sto fondamentalmente cercando di riempire gli interi fino a 9999zero iniziali (ad esempio 1 = 0001).


2
Sì, tutto qui! mio cattivo ... l'ho digitato sul mio telefono. Non hai nemmeno bisogno della "nuova stringa": Integer.toString (num + 10000) .subString (1) funziona.
Randyaa,

. Long.valueOf ( "00.003.400") toString (); . Integer.valueOf ( "00.003.400") toString (); ---> 3400
frekele,

1
vedi anche stackoverflow.com/questions/35521278/… per una soluzione con diagramma
bvdb

Tuttavia, c'è un problema con l' new String(Integer.toString(num + 10000)).substring(1)approccio se numè più grande di 9999, ijs.
Felype,

Risposte:


1697

Usa java.lang.String.format(String,Object...)così:

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

per zero-padding con una lunghezza di 5. Per output esadecimale sostituire il dcon un xas in "%05x".

Le opzioni di formattazione complete sono documentate come parte di java.util.Formatter.


1
Dovrei aspettarmi che le opzioni in String.formatsiano simili a printf () in C?
Ehtesh Choudhury,

13
Se è necessario farlo per un ampio elenco di valori, le prestazioni di DecimalFormat sono almeno 3 volte migliori di String.format (). Sono in procinto di eseguire alcune prestazioni ottimizzando me stesso e eseguendo i due in Visual VM mostra il metodo String.format () che accumula il tempo della CPU a circa 3-4 volte la velocità di DecimalFormat.format ().
Steve Ferguson,

10
E per aggiungere più di 9 zeri usa qualcosa come%012d
Mohammad Banisaeid,

2
Questo è per Java 5 e versioni successive. Per 1.4 e versioni precedenti DecimalFormat è un'alternativa come mostrato qui javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
Ciao ragazzi! Ho dei problemi con:%d can't format java.lang.String arguments
Helio Soares Junior,

116

Diciamo che vuoi stampare 11come011

Si potrebbe utilizzare un formattatore : "%03d".

inserisci qui la descrizione dell'immagine

Puoi usare questo formattatore in questo modo:

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

In alternativa, alcuni metodi java supportano direttamente questi formattatori:

System.out.printf("%03d", a);

5
@Omar Koohei in effetti, ma spiega il ragionamento alla base delle "costanti magiche".
bvdb,

Bella risposta! Solo un commento, il Fformato () dovrebbe essere f: String.format(...);.
David Miguel,

cosa succede se non desidero aggiungere uno 0 iniziale ma un'altra lettera / numero? grazie
chiperortiz

1
@chiperortiz afaik non è possibile con i precedenti strumenti di formattazione. In tal caso, calcolo i caratteri iniziali richiesti (ad es. int prefixLength = requiredTotalLength - String.valueOf(numericValue).length) E quindi utilizzo un metodo di ripetizione stringa per creare il prefisso richiesto. Ci sono vari modi per ripetere le stringhe, ma non c'è un Java Native uno, per quanto ne so: stackoverflow.com/questions/1235179/...
bvdb

114

Se per qualsiasi motivo usi pre 1.5 Java allora puoi provare con il metodo Apache Commons Lang

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

29

Trovato questo esempio ... 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));
    }
}

Testato questo e:

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

Entrambi funzionano, per i miei scopi penso che String.Format sia migliore e più conciso.


1
Sì, stavo per suggerire DecimalFormat perché non sapevo di String.format, ma poi ho visto la risposta di uzhin. String.format deve essere nuovo.
Paul Tomblin,

È simile al modo in cui lo faresti in .Net Tranne il modo .Net sembra più bello per i piccoli numeri.
Omar Kooheji,

Nel mio caso ho usato la prima opzione (DecimalFormat) perché il mio numero era un Double
mauronet

21

Se le prestazioni sono importanti nel tuo caso, potresti farlo da solo con un sovraccarico minore rispetto alla String.formatfunzione:

/**
 * @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();       
}

Prestazione

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

Risultato

Funzione propria: 1697ms

String.format: 38134ms


1
Sopra c'è una menzione dell'uso più rapido di DecimalFormat. Hai avuto qualche nota al riguardo?
Patrick,

@Patrick Per le prestazioni di DecimalFormat vedi anche: stackoverflow.com/questions/8553672/…
Stephan

Scioccante! È pazzesco che la funzione funzioni così male. Ho dovuto azzerare il pad e visualizzare una raccolta di ints senza segno che poteva variare da 1 a 3 cifre. Doveva funzionare alla velocità della luce. Ho usato questo metodo semplice: ha for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";funzionato molto rapidamente (mi dispiace non averlo cronometrato!).
BuvinJ,

Come si confronta la prestazione dopo che è stata eseguita abbastanza per HotSpot per avere un crack?
Phil

16

Puoi utilizzare Google Guava :

Esperto di:

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

Codice di esempio:

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

Nota:

Guavaè molto utile biblioteca, ma fornisce anche un sacco di funzioni che si riferivano a Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, ecc

Rif: GuavaExplained


1
Sopra il codice di esempio è solo l'utilizzo, non proprio il codice di esempio. Il commento riflette questo, avresti bisogno di "String myPaddedString = Strings.padStart (...)"
JoeG

2
Questo metodo offre in realtà risultati di prestazioni molto migliori rispetto a JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag,

10

Prova questo:

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

3

Sebbene molti degli approcci di cui sopra siano buoni, ma a volte abbiamo bisogno di formattare numeri interi e float. Possiamo usarlo, in particolare quando abbiamo bisogno di riempire un numero particolare di zeri sia a sinistra che a destra dei numeri decimali.

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(",",""));  
 }    
}  

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

se si desidera stampare il testo formattato direttamente sullo schermo.


1
Ma OP non l'ha mai chiesto. Internamente String.formate System.out.formatchiama la stessa java.util.Formatterimplementazione.
bsd

... e System.out possono essere reindirizzati.
Phil

1

Usa la classe DecimalFormat, in questo modo:

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

USCITA: 0000811


1

Ecco come formattare la stringa senza usare DecimalFormat.

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

09

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

019

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

0119


0

Controlla il mio codice che funzionerà con numeri interi e String.

Supponiamo che il nostro primo numero sia 2. E vogliamo aggiungere degli zeri a quello, quindi la lunghezza della stringa finale sarà 4. Per questo puoi usare il seguente codice

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

(new char[diff])perché
Isacco,

replace("\0", "0")cos'è ... cosa
Isaac

@Isaac - Prima ho creato un array di caratteri e usando quell'array di caratteri ho creato una stringa. Quindi ho sostituito il carattere null (che è il valore predefinito del tipo di carattere) con "0" (che è il carattere di cui abbiamo bisogno per il riempimento)
Fathah Rehman P

0

È necessario utilizzare un formattatore, il codice seguente utilizza 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));

Uscita: 0001


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

L'unico problema con questo approccio è che ti fa indossare il cappello pensante per capire come funziona.


5
L'unico problema? Provalo con un valore negativo numbero widthmaggiore di 18.
user85421

2
Buon punto. E immagino che faccia più di quanto richiesto poiché si tronca in larghezza (che non è stato esplicitamente richiesto, ma in genere è necessario). È un peccato che Java (dolorosamente lento nel confronto) String.format () non supporti larghezze variabili e non supporti affatto la precisione per gli identificatori di numeri interi.
johncurrier,

-3

Nessun pacchetto necessario:

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

Questo riempirà la stringa di tre caratteri ed è facile aggiungere una parte in più per quattro o cinque. So che questa non è la soluzione perfetta in alcun modo (soprattutto se si desidera una grande stringa imbottita), ma mi piace.


1
Hmm ... mi piace.
Kartik Chugh il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.