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?

Roy
quelle

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

Chris Lercher
quelle
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);
    }
}
Alex Rashkov
quelle
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

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

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

ChadyWady
quelle
17

Verwenden der StringsDienstprogrammklasse von Guava :

Strings.padStart("Apple", 8, '0');
Olivier Grégoire
quelle
15

Sie können dies verwenden:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
Bency Baby
quelle
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.

Erdi İzgi
quelle
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();
robert_x44
quelle
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);
    }
}
Arne Deutsch
quelle
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;
    }
}
Prahler
quelle
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);
}
Fathah Rehman P.
quelle
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;
    }
}
Nabil_H
quelle
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.

Carlos
quelle
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);
}
Deian
quelle
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.

Kuguar6
quelle
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;
Tezra
quelle
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.

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

Googlian
quelle
-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;
  }
}
mR_fr0g
quelle
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