Jak wstawić liczbę całkowitą zerami po lewej stronie?

1022

Jak zostawiłeś pad intz zerami podczas konwersji na Stringjava?

Zasadniczo chcę wypisać liczby całkowite 9999z wiodącymi zerami (np. 1 = 0001).

Omar Kooheji
źródło
2
Tak, to wszystko! mój zły ... Wpisałem to na telefonie. Nie potrzebujesz „nowego ciągu”: Integer.toString (num + 10000) .subString (1) działa.
Randyaa,
Long.valueOf („00003400”). ToString (); Integer.valueOf („00003400”). ToString (); ---> 3400
frekele,
1
zobacz także stackoverflow.com/questions/35521278/... dla rozwiązania ze schematem
bvdb
Istnieje problem z new String(Integer.toString(num + 10000)).substring(1)podejściem, jeśli numjest większy niż 9999, ijs.
Felype

Odpowiedzi:

1694

Użyj w java.lang.String.format(String,Object...)ten sposób:

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

dla zerami o długości 5. Na wyjściu szesnastkowym wymienić dze związkiem xwedług "%05x".

Pełne opcje formatowania są dokumentowane jako część java.util.Formatter.

Yoni Roit
źródło
1
Czy powinienem oczekiwać, że opcje w String.formatbędą podobne do printf () w C?
Ehtesh Choudhury,
13
Jeśli musisz to zrobić dla dużej listy wartości, wydajność DecimalFormat jest co najmniej 3 razy lepsza niż String.format (). Jestem w trakcie dostrajania wydajności i uruchamianie dwóch w Visual VM pokazuje metodę String.format () sumującą czas CPU z szybkością około 3-4 razy większą niż DecimalFormat.format ().
Steve Ferguson
10
Aby dodać więcej niż 9 zer, użyj czegoś takiego%012d
Mohammad Banisaeid
2
Dotyczy to wersji Java 5 i nowszych. Dla 1.4 i niższych DecimalFormat jest alternatywą, jak pokazano tutaj javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
1
Cześć chłopaki! Mam pewne problemy z używaniem:%d can't format java.lang.String arguments
Helio Soares Junior
115

Powiedzmy, że chcesz wydrukować 11jako011

Można użyć formatowania : "%03d".

wprowadź opis zdjęcia tutaj

Możesz użyć tego formatyzatora w następujący sposób:

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

Alternatywnie, niektóre metody Java bezpośrednio obsługują następujące formaterery:

System.out.printf("%03d", a);
bvdb
źródło
5
@Omar Koohei rzeczywiście, ale wyjaśnia uzasadnienie „magicznych stałych”.
bvdb
Niezła odpowiedź! Tylko komentarz, Fformat () powinny być f: String.format(...);.
David Miguel
co jeśli nie chcę dodawać początkowego 0, ale kolejną literę / cyfrę? dzięki
chiperortiz
1
@chiperortiz afaik przy użyciu powyższych narzędzi formatujących nie jest możliwe. W takim przypadku obliczam wymagane znaki wiodące (np. int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), A następnie używam metody powtarzania łańcucha, aby utworzyć wymagany przedrostek. Istnieją różne sposoby powtarzania ciągów, ale nie ma natywnego języka Java, afaik: stackoverflow.com/questions/1235179/…
bvdb
114

Jeśli z jakiegokolwiek powodu korzystasz z Javy w wersji wcześniejszej niż 1.5, możesz wypróbować metodę Apache Commons Lang

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')
Boris Pavlović
źródło
29

Znaleziono ten przykład ... Testuje ...

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

Testowałem to i:

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

Oba działają, dla moich celów Myślę, że String.Format jest lepszy i bardziej zwięzły.

Omar Kooheji
źródło
1
Tak, zamierzałem zasugerować DecimalFormat, ponieważ nie wiedziałem o String.format, ale potem zobaczyłem odpowiedź uzhina. String.format musi być nowy.
Paul Tomblin
Podobnie jest w przypadku .Net. Z wyjątkiem tego, że sposób .Net wygląda ładniej dla małych liczb.
Omar Kooheji
W moim przypadku użyłem pierwszej opcji (DecimalFormat), ponieważ mój numer to Double
mauronet
21

Jeśli wydajność jest ważna w twoim przypadku, możesz to zrobić samemu z mniejszym narzutem w porównaniu do String.formatfunkcji:

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

Wydajność

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

Wynik

Własna funkcja: 1697ms

String.format: 38134ms

das Keks
źródło
1
Powyżej wspomniano o szybszym użyciu DecimalFormat. Czy miałeś na ten temat jakieś uwagi?
Patrick
@Patrick Aby zobaczyć wydajność DecimalFormat zobacz także: stackoverflow.com/questions/8553672/…
Stephan
Wstrząsający! To orzechy, które działają tak źle. Musiałem wyzerować pad i wyświetlić kolekcję niepodpisanych liczb wewnętrznych, które mogą zawierać od 1 do 3 cyfr. Musiał działać błyskawicznie. Użyłem tej prostej metody: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";działało to bardzo szybko (przepraszam, że tego nie czas!).
BuvinJ
Jak wypada porównanie wydajności po uruchomieniu jej na tyle, aby HotSpot miał na nią ochotę?
Phil
16

Możesz użyć Google Guava :

Maven:

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

Przykładowy kod:

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

Uwaga:

GuavaBiblioteka jest bardzo przydatna, ale także zawiera wiele funkcji, które związane Collections, Caches, Functional idioms, Concurrency,Strings , Primitives, Ranges, IO, Hashing, EventBus, etc

Ref: Guava Wyjaśnione

Chociaż
źródło
1
Powyższy przykładowy kod to tylko użycie, a nie przykładowy kod. Komentarz odzwierciedla to, potrzebujesz „String myPaddedString = Strings.padStart (...)”
JoeG
2
Ta metoda faktycznie daje znacznie lepsze wyniki wydajności niż JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag
10

Spróbuj tego:

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
źródło
3

Chociaż wiele z powyższych podejść jest dobrych, ale czasami musimy sformatować liczby całkowite oraz zmiennoprzecinkowe. Możemy tego użyć, szczególnie gdy potrzebujemy wstawić określoną liczbę zer po lewej i po prawej stronie liczb dziesiętnych.

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

jeśli chcesz wydrukować sformatowany tekst bezpośrednio na ekranie.

Shashi
źródło
1
Ale OP nigdy o to nie prosił. Wewnętrznie String.formati System.out.formatwywołać tę samą java.util.Formatterimplementację.
bsd
... i System.out można przekierować.
Phil
1

Użyj klasy DecimalFormat, na przykład:

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

WYDAJNOŚĆ: 0000811

Shomu
źródło
1

Oto jak możesz sformatować swój ciąg bez użycia DecimalFormat.

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

09

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

019

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

0119

Morgan Koh
źródło
0

Sprawdź mój kod, który będzie działał dla liczb całkowitych i ciągów.

Załóżmy, że naszym pierwszym numerem jest 2. I chcemy do tego dodać zera, aby długość końcowego łańcucha wynosiła 4. W tym celu możesz użyć następującego kodu

    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.
źródło
(new char[diff])dlaczego
Izaak
replace("\0", "0")co jest ... co
Izaak
@Isaac - Najpierw utworzyłem tablicę znaków, a używając tej tablicy znaków utworzyłem ciąg. Następnie zastąpiłem znak zerowy (która jest domyślną wartością typu char) na „0” (który jest char, którego potrzebujemy tutaj do wypełniania)
Fathah Rehman P
0

Musisz użyć formatera, następujący kod używa 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));

Wyjście: 0001

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

Jedynym problemem związanym z tym podejściem jest to, że wkładasz myślący kapelusz, aby dowiedzieć się, jak to działa.

johncurrier
źródło
5
Jedyny problem? Wypróbuj z wynikiem ujemnym numberlub widthwiększym niż 18.
5'11
2
Słuszna uwaga. I myślę, że robi więcej, niż było wymagane, ponieważ obcina się na szerokość (co nie było wyraźnie wymagane, ale jest zwykle potrzebne). Szkoda, że ​​Java (boleśnie powolny w porównaniu) String.format () nie obsługuje zmiennych o szerokości i wcale nie obsługuje precyzji dla specyfikatorów liczb całkowitych.
johncurrier
-3

Żadne pakiety nie są potrzebne:

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

Spowoduje to dodanie ciągu do trzech znaków i łatwe dodanie części dla czterech lub pięciu. Wiem, że to nie jest idealne rozwiązanie w żaden sposób (zwłaszcza jeśli chcesz duży wyściełany sznurek), ale mi się podoba.

NoShadowKick
źródło
1
Hmm ... podoba mi się.
Kartik Chugh,