Wie kann ich eine Ganzzahl mit Nullen auf der linken Seite auffüllen?

1022

Wie können Sie intbeim Konvertieren in a Stringin Java ein Pad mit Nullen belassen ?

Ich versuche im Grunde, ganze Zahlen 9999mit führenden Nullen (z 0001. B. 1 = ) aufzufüllen .

Omar Kooheji
quelle
2
Ja, das ist es! mein schlechtes ... Ich habe es auf meinem Handy eingegeben. Sie brauchen den "neuen String" auch nicht: Integer.toString (num + 10000) .SubString (1) funktioniert.
Randyaa
Long.valueOf ("00003400"). ToString (); Integer.valueOf ("00003400"). ToString (); ---> 3400
frekele
1
Siehe auch stackoverflow.com/questions/35521278/… für eine Lösung mit Diagramm
bvdb
Es gibt ein Problem mit dem new String(Integer.toString(num + 10000)).substring(1)Ansatz, wenn er numgrößer als 9999 ist, ijs.
Felype

Antworten:

1696

Verwenden Sie java.lang.String.format(String,Object...)wie folgt:

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

für Null-Padding mit einer Länge von 5. Für hexadezimale Ausgabe ersetzen Sie das ddurch ein xwie in "%05x".

Die vollständigen Formatierungsoptionen sind als Teil von dokumentiert java.util.Formatter.

Yoni Roit
quelle
1
Sollte ich erwarten, dass die Optionen in String.formatprintf () in C ähnlich sind?
Ehtesh Choudhury
13
Wenn Sie dies für eine große Liste von Werten tun müssen, ist die Leistung von DecimalFormat mindestens dreimal besser als die von String.format (). Ich bin gerade dabei, die Leistung selbst zu optimieren und die beiden in Visual VM auszuführen. Dies zeigt die String.format () -Methode, die die CPU-Zeit mit der 3-4-fachen Rate von DecimalFormat.format () akkumuliert.
Steve Ferguson
10
Und um mehr als 9 Nullen hinzuzufügen, verwenden Sie etwas wie%012d
Mohammad Banisaeid
2
Dies gilt für Java 5 und höher. Für 1.4 und niedriger ist DecimalFormat eine Alternative, wie hier gezeigt. Javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
1
Hallo Leute! Ich habe einige Probleme mit:%d can't format java.lang.String arguments
Helio Soares Junior
116

Sagen wir , Sie drucken möchten 11als011

Sie könnten einen Formatierer verwenden : "%03d".

Geben Sie hier die Bildbeschreibung ein

Sie können diesen Formatierer folgendermaßen verwenden:

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

Alternativ unterstützen einige Java-Methoden diese Formatierer direkt:

System.out.printf("%03d", a);
bvdb
quelle
5
@Omar Koohei zwar, aber es erklärt die Gründe für die "magischen Konstanten".
Bvdb
Gute Antwort! Nur ein Kommentar, das Fvon format () sollte sein f: String.format(...);.
David Miguel
Was ist, wenn ich keine führende 0, sondern einen anderen Buchstaben / eine andere Zahl anhängen möchte? danke
chiperortiz
1
@chiperortiz afaik Mit den oben genannten Formatierungswerkzeugen ist dies nicht möglich. In diesem Fall berechne ich die erforderlichen führenden Zeichen (z. B. int prefixLength = requiredTotalLength - String.valueOf(numericValue).length) und verwende dann eine Wiederholungszeichenfolgenmethode, um das erforderliche Präfix zu erstellen. Es gibt verschiedene Möglichkeiten, Zeichenfolgen zu wiederholen, aber es gibt keine native Java-Zeichenfolge, afaik: stackoverflow.com/questions/1235179/…
bvdb
114

Wenn Sie aus irgendeinem Grund Java vor 1.5 verwenden, versuchen Sie es möglicherweise mit der Apache Commons Lang-Methode

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

Fand dieses Beispiel ... Wird testen ...

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

Getestet und:

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

Beide funktionieren, für meine Zwecke denke ich, dass String.Format besser und prägnanter ist.

Omar Kooheji
quelle
1
Ja, ich wollte DecimalFormat vorschlagen, weil ich nichts über String.format wusste, aber dann sah ich Uhinins Antwort. String.format muss neu sein.
Paul Tomblin
Es ist ähnlich, wie Sie es in .Net machen würden, außer dass die .Net-Methode für kleine Zahlen besser aussieht.
Omar Kooheji
In meinem Fall habe ich die erste Option (DecimalFormat) , weil meine Nummer ein Doppel war
mauronet
21

Wenn die Leistung in Ihrem Fall wichtig ist, können Sie dies mit weniger Aufwand im Vergleich zur String.formatFunktion selbst tun :

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

Ergebnis

Eigene Funktion: 1697ms

String.format: 38134ms

das Keks
quelle
1
Oben wird erwähnt, dass DecimalFormat schneller ist. Hattest du irgendwelche Notizen dazu?
Patrick
@Patrick Für die Leistung von DecimalFormat siehe auch: stackoverflow.com/questions/8553672/…
Stephan
Schockierend! Es ist verrückt, dass die Funktion so schlecht funktioniert. Ich musste das Pad auf Null setzen und eine Sammlung von Ints ohne Vorzeichen anzeigen, die zwischen 1 und 3 Stellen liegen konnten. Es musste blitzschnell arbeiten. Ich habe diese einfache Methode angewendet: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";Das hat sehr schnell funktioniert (sorry, ich habe es nicht zeitlich festgelegt!).
BuvinJ
Wie ist die Leistung zu vergleichen, nachdem HotSpot so weit ausgeführt wurde, dass es einen Riss gibt?
Phil
16

Sie können Google Guava verwenden :

Maven:

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

Beispielcode:

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

Hinweis:

Guavasehr nützliche Bibliothek ist, bietet es auch viele Funktionen, die im Zusammenhang Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, usw.

Ref: GuavaErläutert

Tho
quelle
1
Der obige Beispielcode ist nur die Verwendung, nicht wirklich der Beispielcode. Der Kommentar spiegelt dies wider, Sie würden "String myPaddedString = Strings.padStart (...)"
JoeG
2
Diese Methode liefert tatsächlich viel bessere Leistungsergebnisse als JDK String.format / MessageFormatter / DecimalFormatter.
Rafalmag
10

Probier diese:

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
quelle
3

Obwohl viele der oben genannten Ansätze gut sind, müssen wir manchmal sowohl Ganzzahlen als auch Gleitkommazahlen formatieren. Wir können dies verwenden, insbesondere wenn wir eine bestimmte Anzahl von Nullen links und rechts von Dezimalzahlen auffüllen müssen.

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
quelle
2
int x = 1;
System.out.format("%05d",x);

Wenn Sie den formatierten Text direkt auf den Bildschirm drucken möchten.

Shashi
quelle
1
Aber OP hat nie danach gefragt. Intern String.formatund System.out.formatrufen Sie die gleiche java.util.FormatterImplementierung auf.
BSD
... und System.out können umgeleitet werden.
Phil
1

Verwenden Sie die Klasse DecimalFormat wie folgt:

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

AUSGABE: 0000811

Shomu
quelle
1

So können Sie Ihre Zeichenfolge ohne Verwendung formatieren DecimalFormat.

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

09

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

019

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

0119

Morgan Koh
quelle
0

Überprüfen Sie meinen Code, der für Ganzzahl und Zeichenfolge funktioniert.

Angenommen, unsere erste Zahl ist 2. Und wir möchten Nullen hinzufügen, damit die Länge der letzten Zeichenfolge 4 beträgt. Dafür können Sie den folgenden Code verwenden

    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.
quelle
(new char[diff])warum
Isaac
replace("\0", "0")was ist ... was
Isaac
@Isaac - Zuerst habe ich ein Zeichenarray erstellt und mit diesem Zeichenarray eine Zeichenfolge erstellt. Dann habe ich das Nullzeichen (das der Standardwert des Zeichentyps ist) durch "0" ersetzt (das ist das Zeichen, das wir hier zum Auffüllen benötigen)
Fathah Rehman P
0

Sie müssen einen Formatierer verwenden. Der folgende Code verwendet 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));

Ausgabe: 0001

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

Das einzige Problem bei diesem Ansatz ist, dass Sie Ihren Denkhut aufsetzen müssen, um herauszufinden, wie er funktioniert.

Johncurrier
quelle
5
Das einzige Problem? Versuchen Sie es mit einem Negativ numberoder mit einem width
Wert
2
Guter Punkt. Und ich denke, es macht mehr als angefordert, da es in der Breite abgeschnitten wird (was nicht explizit angefordert wurde, aber normalerweise benötigt wird). Es ist eine Schande, dass Javas (im Vergleich schmerzhaft langsam) String.format () keine variablen Breiten und überhaupt keine Genauigkeit für Ganzzahlspezifizierer unterstützt.
Johncurrier
-3

Keine Pakete erforderlich:

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

Dadurch wird die Zeichenfolge auf drei Zeichen aufgefüllt, und es ist einfach, einen weiteren Teil für vier oder fünf Zeichen hinzuzufügen. Ich weiß, dass dies in keiner Weise die perfekte Lösung ist (besonders wenn Sie eine große gepolsterte Saite wollen), aber ich mag es.

NoShadowKick
quelle
1
Hmm ... ich mag es.
Kartik Chugh