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.