Bagaimana saya bisa membuat bilangan bulat dengan nol di sebelah kiri?


1022

Bagaimana Anda meninggalkan pad intdengan nol saat mengonversi ke Stringdalam java?

Saya pada dasarnya ingin menambah bilangan bulat 9999dengan memimpin nol (misalnya 1 = 0001).


2
Yup, itu dia! salahku ... aku mengetiknya di ponselku. Anda tidak perlu "String baru": Integer.toString (num + 10000) .subString (1) berfungsi.
Randyaa

Long.valueOf ("00003400"). ToString (); Integer.valueOf ("00003400"). ToString (); ---> 3400
frekele

1
lihat juga stackoverflow.com/questions/35521278/… untuk solusi dengan diagram
bvdb

Ada masalah dengan new String(Integer.toString(num + 10000)).substring(1)pendekatan jika numada yang lebih besar dari 9999, ijs.
Felype

Jawaban:


1696

Gunakan java.lang.String.format(String,Object...)seperti ini:

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

untuk zero-padding dengan panjang 5. Untuk output heksadesimal, ganti ddengan a xseperti pada "%05x".

Opsi pemformatan lengkap didokumentasikan sebagai bagian dari java.util.Formatter.


1
Haruskah saya mengharapkan opsi String.formatmenjadi serupa dengan printf () di C?
Ehtesh Choudhury

13
Jika Anda harus melakukan ini untuk daftar nilai yang besar, kinerja DecimalFormat setidaknya 3 kali lebih baik daripada String.format (). Saya sedang dalam proses melakukan beberapa tuning kinerja sendiri dan menjalankan keduanya di Visual VM menunjukkan metode String.format () mengakumulasi waktu CPU sekitar 3-4 kali laju DecimalFormat.format ().
Steve Ferguson

10
Dan untuk menambahkan lebih dari 9 nol gunakan sesuatu seperti%012d
Mohammad Banisaeid

2
Ini untuk Java 5 dan di atasnya. Untuk 1.4 dan lebih rendah DecimalFormat adalah alternatif seperti yang ditunjukkan di sini javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
Hai kawan! Saya memiliki beberapa masalah dalam menggunakan:%d can't format java.lang.String arguments
Helio Soares Junior

116

Katakanlah Anda ingin mencetak 11sebagai011

Anda bisa menggunakan formatter : "%03d".

masukkan deskripsi gambar di sini

Anda dapat menggunakan formatter ini seperti ini:

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

Atau, beberapa metode java secara langsung mendukung pemformat ini:

System.out.printf("%03d", a);

5
@Omar Koohei memang, tapi itu menjelaskan alasan di balik "konstanta sihir".
bvdb

Jawaban bagus! Hanya komentar, yang Fformat () harus f: String.format(...);.
David Miguel

bagaimana jika saya tidak ingin menambahkan 0 terkemuka tetapi huruf / angka lain? terima kasih
chiperortiz

1
@chiperortiz afaik tidak mungkin dengan alat pemformatan di atas. Dalam hal itu, saya menghitung karakter utama yang diperlukan (misalnya int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), dan kemudian menggunakan metode string berulang untuk membuat awalan yang diperlukan. Ada berbagai cara untuk mengulang string, tetapi tidak ada yang asli java, afaik: stackoverflow.com/questions/1235179/…
bvdb

114

Jika Anda karena alasan apa pun menggunakan pra 1.5 Java maka dapat mencoba dengan metode Apache Commons Lang

org.apache.commons.lang.StringUtils.leftPad(String str, int size, '0')

29

Menemukan contoh ini ... Akan menguji ...

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

Menguji ini dan:

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

Keduanya berfungsi, untuk tujuan saya, saya pikir String.Format lebih baik dan lebih ringkas.


1
Ya, saya akan menyarankan DecimalFormat karena saya tidak tahu tentang String.format, tapi kemudian saya melihat jawaban uzhin. String.format harus baru.
Paul Tomblin

Ini mirip dengan cara Anda melakukannya di. Net. Kecuali cara .Net terlihat lebih bagus untuk jumlah kecil.
Omar Kooheji

Dalam kasus saya, saya menggunakan opsi pertama (DecimalFormat) karena nomor saya adalah Double
mauronet

21

Jika kinerja penting dalam kasus Anda, Anda bisa melakukannya sendiri dengan overhead yang lebih sedikit dibandingkan dengan String.formatfungsinya:

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

Performa

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

Hasil

Fungsi sendiri: 1697 ms

String.format: 38134ms


1
Di atas ada yang menyebutkan menggunakan DecimalFormat menjadi lebih cepat. Apakah Anda punya catatan tentang itu?
Patrick

@ Patrick Untuk kinerja DecimalFormat lihat juga: stackoverflow.com/questions/8553672/…
Stephan

Mengejutkan! Kacang itu fungsinya sangat buruk. Saya harus nol pad dan menampilkan koleksi int unsigned yang dapat berkisar antara 1 hingga 3 digit. Itu perlu bekerja secepat kilat. Saya menggunakan metode sederhana ini: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";Itu bekerja sangat cepat (maaf saya tidak mengatur waktu!).
BuvinJ

Bagaimana kinerja dibandingkan setelah dijalankan cukup untuk HotSpot untuk memiliki celah di dalamnya?
Phil

16

Anda dapat menggunakan Google Guava :

Maven:

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

Kode sampel:

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

catatan:

Guavaadalah perpustakaan yang sangat berguna, juga menyediakan banyak fitur yang terkait dengan Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing,EventBus , dll

Ref: GuavaExplained


1
Kode sampel di atas hanya penggunaan, bukan kode sampel sebenarnya. Komentar mencerminkan ini, Anda akan memerlukan "String myPaddedString = Strings.padStart (...)"
JoeG

2
Metode ini sebenarnya memberikan hasil kinerja yang jauh lebih baik daripada JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag

10

Coba yang ini:

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

Meskipun banyak dari pendekatan di atas baik, tetapi kadang-kadang kita perlu memformat bilangan bulat serta mengapung. Kita dapat menggunakan ini, terutama ketika kita perlu memasukkan angka nol tertentu di sebelah kiri dan kanan angka desimal.

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

jika Anda ingin mencetak teks yang diformat langsung ke layar.


1
Tapi OP tidak pernah memintanya. Secara internal String.formatdan System.out.formatsebut java.util.Formatterimplementasi yang sama .
bsd

... dan System.out dapat dialihkan.
Phil

1

Gunakan kelas DecimalFormat, seperti:

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

OUTPUT: 0000811


1

Inilah cara Anda dapat memformat string Anda tanpa menggunakan DecimalFormat.

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

09

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

019

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

0119


0

Periksa kode saya yang akan berfungsi untuk integer dan String.

Asumsikan angka pertama kita adalah 2. Dan kita ingin menambahkan nol untuk itu sehingga panjang string akhir akan menjadi 4. Untuk itu Anda dapat menggunakan kode berikut

    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])mengapa
Isaac

replace("\0", "0")apa itu ... apa
Isaac

@Isaac - Pertama saya membuat array char, dan menggunakan array char saya membuat string. Kemudian saya mengganti karakter nol (yang merupakan nilai default dari tipe char) dengan "0" (yang merupakan char yang kita butuhkan di sini untuk pengisian)
Fathah Rehman P

0

Anda perlu menggunakan Formatter, kode berikut menggunakan 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));

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

Satu-satunya masalah dengan pendekatan ini adalah bahwa hal itu membuat Anda memakai topi berpikir Anda untuk mengetahui cara kerjanya.


5
Satu-satunya masalah? Cobalah dengan negatif numberatau dengan yang widthlebih besar dari 18.
user85421

2
Poin yang bagus. Dan saya kira itu lebih dari yang diminta karena memotong lebar (yang tidak secara eksplisit diminta tetapi biasanya diperlukan). Sangat memalukan bahwa String (format sangat lambat dibandingkan) Java tidak mendukung lebar variabel dan tidak mendukung presisi sama sekali untuk penentu integer.
johncurrier

-3

Tidak perlu paket:

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

Ini akan membuat string menjadi tiga karakter, dan mudah untuk menambahkan bagian lebih banyak untuk empat atau lima. Saya tahu ini bukan solusi yang sempurna dengan cara apa pun (terutama jika Anda menginginkan tali besar yang empuk), tetapi saya menyukainya.


1
Hmm ... aku suka itu.
Kartik Chugh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.