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

Omar Kooheji
sumber
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.

Yoni Roit
sumber
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);
bvdb
sumber
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')
Boris Pavlovic
sumber
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.

Omar Kooheji
sumber
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

das Keks
sumber
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

Tho
sumber
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
Brijesh Patel
sumber
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(",",""));  
 }    
}  
Deepak
sumber
2
int x = 1;
System.out.format("%05d",x);

jika Anda ingin mencetak teks yang diformat langsung ke layar.

Shashi
sumber
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

Shomu
sumber
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

Morgan Koh
sumber
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);
Fathah Rehman P
sumber
(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

JoBⅈN
sumber
-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.

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

NoShadowKick
sumber
1
Hmm ... aku suka itu.
Kartik Chugh