Wie formatiere ich einen Java-String mit führender Null?


191

Hier ist der String zum Beispiel:

"Apple"

und ich möchte Null hinzufügen, um 8 Zeichen auszufüllen:

"000Apple"

Wie kann ich das machen?

Antworten:


287

Falls Sie es ohne die Hilfe einer Bibliothek tun müssen:

("00000000" + "Apple").substring("Apple".length())

(Funktioniert, solange Ihr String nicht länger als 8 Zeichen ist.)


21
Das ist ziemlich klug - aber ich habe ungefähr 30 Sekunden gebraucht, um es zu "bekommen". Ich denke, eine besser lesbare Lösung wäre besser.
Amy B

2
Dies ist eine hervorragende Lösung, wenn Sie Software in etwas ohne viel Speicherplatz einbetten und die zusätzlichen Bibliotheken einfach keine Option sind. Vielen Dank!!
Casey Murray

Diese Version ist schnell verrückt! Ich liebe es.
Dakkaron

2
@ Mathu ehrlich gesagt ist das nicht schwer zu verstehen. Zwei Zeichenfolgen werden verkettet (zusammengefügt) und die ersten 5 Zeichen werden daraus extrahiert. Keine Magie. In diesem Fall nicht sehr sinnvoll (für Apple mit fester Saite), aber leicht zu verstehen. ("0000" + theString).substring(theString.length())ist realistischer. Diese Pads theStringmit führenden Nullen. Sorry konnte nicht widerstehen, diesen Kommentar hinzuzufügen :)
HankCa

1
Diese Lösung hat eine kurze Syntax, ist aber nicht "verrückt schnell". Wenn Sie Glück haben, wird der Compiler es optimieren, aber im Wesentlichen ist der "schnelle" Weg, dies zu tun, die Verwendung von a StringBuilder, und es dauert eine Schleife, um es zu füllen. Wenn die Anforderung wirklich darin besteht, nur Zeichenfolgen mit 8 Zeichen abzuschneiden, ist dies in Ordnung, obwohl dies ein sehr enger Anwendungsfall ist, aber diese Lösung kann niemals schnell aufgerufen werden. Es ist nur kurz.
Dici

319
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}

14
aber ich möchte führende Null vor einem String anstelle eines int hinzufügen.
Roy

1
Sie können StringUtils oder DecimalFormat für Java 1.4 und niedriger verwenden. Überprüfen Sie hier javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag verwenden %07s statt %07d, erhalten Sie eine FormatFlagsConversionMismatchException. du kannst es versuchen.
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

Dies ist von commons-lang . Siehe Javadoc


3
Warum nicht commons-lang verwenden? Es hat eine Beute von nützlichen Extras.
Bozho

7
Auch wenn Sie commons-lang nicht verwenden können, können Sie die Quelle einfach von StringUtils kopieren, um Ihre eigene Funktion zu erstellen. Das wäre eine viel bessere allgemeine Lösung als die ausgewählte Antwort. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
Was wäre, wenn dies die einzige Methode wäre, für die die Bibliothek verwendet wird? Vielleicht ist die hinzugefügte Bibliothek sogar um ein Vielfaches größer als die App, in der sie verwendet wird. Ich kann mir einige Gründe vorstellen , einer Commons-Bibliothek keine Commons-Bibliothek hinzuzufügen. Verstehen Sie mich nicht falsch: Ich stimme zu, es enthält sehr nützliche Dinge, aber ich verstehe die Zurückhaltung, eine App voller externer JARs zu füllen, wenn der Vorteil nicht darin besteht, nur eine (oder mehrere) Methoden zu schreiben.
Bart Kiers

2
Um die Frage zu beantworten: "Warum nicht commons-lang verwenden? Es gibt eine Menge nützlicher Extras." Frage mit einem konkreten Beispiel. Xiaomi liefert eine veraltete Version von commons-lang auf seinen Android-Geräten aus. Das Einfügen einer neueren Version in Ihre App führt zu Klassenladekonflikten, sodass commons-lang in keinem Android-Projekt mehr verwendet werden kann.
Nachi

1
@Nachi auch wenn veraltete StringUtils.leftPad existieren sollte
Lluis Martinez

29

Darum hat er wirklich gebeten, glaube ich:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

Ausgabe:

000Apple

Funktioniert nicht für den allgemeinen Fall; Wenn Sie "Apple" durch eine Zeichenfolge mit einer Länge von 8 Zeichen ersetzen (was im Fall von OP möglich ist), wird ein DuplicateFormatFlagsException(aufgrund der 00Zeichenfolge im Format) ausgegeben. Wenn Sie eine Zeichenfolge ersetzen, die länger als 8 Zeichen ist, wird ein IllegalFormatFlagsException(aufgrund der negativen Zahl) ausgegeben.
Nbrooks

Sie haben Recht, aber was ist dann damit : String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Jetzt haben Sie diese Ausnahme nicht mehr.
Abhinav Puri

Nur hinzufügen wollen String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);ist FALSCH, es sollte sein String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Tolle Lösung! +1
user1697575

25

Sie können die in einer anderen Antwort verwendete String.format-Methode verwenden, um eine Zeichenfolge mit Nullen zu generieren.

String.format("%0"+length+"d",0)

Dies kann auf Ihr Problem angewendet werden, indem Sie die Anzahl der führenden Nullen in einer Formatzeichenfolge dynamisch anpassen:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

Es ist immer noch eine unübersichtliche Lösung, hat aber den Vorteil, dass Sie die Gesamtlänge der resultierenden Zeichenfolge mithilfe eines ganzzahligen Arguments angeben können.



15

Sie können dies verwenden:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

Mit Abstand die beste Antwort. Apache Commons StringUtils ist eine einfache, aber äußerst hilfreiche Bibliothek.
Zoidberg

Das hat viel Zeit gespart und ist auch ordentlich und sauber.
Abhishek

9

Ich war in einer ähnlichen Situation und habe diese genutzt. Es ist ziemlich prägnant und Sie müssen sich nicht mit der Länge oder einer anderen Bibliothek befassen.

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

Einfach und ordentlich. Das Zeichenfolgenformat wird zurückgegeben, " Apple"sodass nach dem Ersetzen des Leerzeichens durch Nullen das gewünschte Ergebnis erzielt wird.


Dann möchten Sie möglicherweise zuerst die Zeichenfolge teilen, die obige Operation auf den ersten Teilungswert anwenden und dann den Rest der Teilungswerte verketten.
Erdi İzgi

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();


1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}

1

Möglicherweise müssen Sie sich um Edgecase kümmern. Dies ist eine generische Methode.

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}

1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}

1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}

Während dieser Code - Schnipsel zu begrüßen ist, und etwas Hilfe bieten kann, würde es erheblich verbessert , wenn es eine Erklärung enthalten von , wie es um die Frage anspricht. Ohne das hat Ihre Antwort einen viel geringeren pädagogischen Wert - denken Sie daran, dass Sie die Frage in Zukunft für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten.
Toby Speight

1

In Java:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

In Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

Sie können auch eine Möglichkeit in Java 8 untersuchen, dies mithilfe von Streams zu tun und zu reduzieren (ähnlich wie bei Scala). Es ist ein bisschen anders als alle anderen Lösungen und ich mag es besonders.


0

Dies ist schnell und funktioniert für jede Länge.

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}

0

Kann schneller sein als Chris Lercher antwortet, wenn die meisten in String genau 8 Zeichen haben

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

in meinem Fall auf meiner Maschine 1/8 schneller.


0

Hier ist die einfache API-freie "lesbare Skript" -Version, die ich zum Vorpolstern eines Strings verwende. (Einfach, lesbar und einstellbar).

while(str.length() < desired_length)
  str = '0'+str;

0

Hat jemand diese reine Java-Lösung (ohne SpringUtils) ausprobiert:

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

Leider funktioniert diese Lösung nur, wenn Sie keine Leerzeichen in einer Zeichenfolge haben.


0

Wenn Sie das Programm in reinem Java schreiben möchten, können Sie die folgende Methode anwenden, oder es gibt viele String-Utils, die Ihnen bei erweiterten Funktionen helfen.

Mit einer einfachen statischen Methode können Sie dies wie folgt erreichen.

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

Sie können die obige Methode verwenden addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

Die Ausgabe wäre 000Apple


-3

Es ist nicht schön, aber es funktioniert. Wenn Sie Zugriff auf Apache Commons haben, würde ich vorschlagen, dass Sie das verwenden

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
Die -1 ist wahrscheinlich, weil dies ein nicht so gutes Beispiel ist: Sie verwenden "magische Zahlen" und verketten Strings, was durch die Verwendung eines StringBuilder oder StringBuffer ersetzt werden sollte.
Bart Kiers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.