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


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.


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

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

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.


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


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


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

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

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

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


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


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


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

(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


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


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.


1
Hmm ... podoba mi się.
— Kartik Chugh,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.