Bagaimana memformat string Java dengan awalan nol?

192

Inilah String, misalnya:

"Apple"

dan saya ingin menambahkan nol untuk mengisi 8 karakter:

"000Apple"

Bagaimana saya bisa melakukannya?

Roy
sumber

Jawaban:

287

Jika Anda harus melakukannya tanpa bantuan perpustakaan:

("00000000" + "Apple").substring("Apple".length())

(Berfungsi, selama String Anda tidak lebih dari 8 karakter.)

Chris Lercher
sumber
21
Itu cukup pintar - tetapi butuh sekitar 30 detik untuk "mendapatkannya". Saya pikir solusi yang lebih mudah dibaca akan lebih baik.
Amy B
2
Ini adalah solusi yang sangat baik ketika Anda menanamkan perangkat lunak pada sesuatu tanpa banyak ruang dan perpustakaan tambahan bukanlah suatu pilihan. Terima kasih!!
Casey Murray
Versi ini gila cepat! Aku menyukainya.
Dakkaron
2
@Mathu jujur ​​itu tidak sulit dimengerti. Dua string digabungkan (digabung bersama) dan 5 karakter pertama diekstraksi darinya. Tanpa sihir. Tidak terlalu masuk akal dalam hal ini (untuk string Apple tetap) tetapi mudah dimengerti. ("0000" + theString).substring(theString.length())lebih realistis. Ini bantalan theStringdengan nol terkemuka. Maaf tidak bisa menolak menambahkan komentar ini :)
HankCa
1
Solusi ini memiliki sintaks pendek tetapi tidak "gila cepat". Jika Anda beruntung, kompiler akan mengoptimalkannya tetapi pada dasarnya cara "cepat" yang sebenarnya untuk melakukannya adalah menggunakan a StringBuilder, dan dibutuhkan loop untuk mengisinya. Jika persyaratan benar-benar hanya memotong string 8-karakter yang ok, meskipun itu adalah kasus penggunaan yang sangat sempit, tetapi solusi ini tidak pernah bisa disebut cepat. Itu hanya singkat.
Dici
321
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}
Alex Rashkov
sumber
14
tapi saya ingin menambahkan nol di depan sebelum sebuah string, bukan int.
Roy
1
Anda dapat menggunakan StringUtils atau DecimalFormat untuk Java 1.4 dan di bawahnya. Lihat di sini javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
3
@Variag digunakan %07s alih-alih %07d, Anda akan mendapatkan FormatFlagsConversionMismatchException. kamu bisa mencobanya.
Z fp
127
 StringUtils.leftPad(yourString, 8, '0');

Ini dari commons-lang . Lihat javadoc

Bozho
sumber
3
Mengapa tidak menggunakan commons-lang? Ini memiliki jarahan ekstra yang berguna.
Bozho
7
Bahkan jika Anda tidak dapat menggunakan commons-lang, Anda dapat dengan mudah menyalin sumber dari StringUtils untuk membuat fungsi Anda sendiri. Itu akan menjadi solusi umum yang jauh lebih baik daripada jawaban yang dipilih. docjar.com/html/api/org/apache/commons/lang/…
kaliatech
3
bagaimana jika itu akan menjadi satu-satunya metode perpustakaan digunakan untuk? Mungkin pustaka yang ditambahkan bahkan beberapa kali lebih besar dari aplikasi yang digunakan. Saya dapat membayangkan beberapa alasan untuk tidak menambahkan pustaka bersama dalam suatu aplikasi. Jangan salah paham: Saya setuju, ini berisi hal-hal yang sangat berguna, tetapi saya memahami keengganan untuk mengisi aplikasi yang penuh dengan JAR eksternal jika manfaatnya tidak perlu menulis hanya satu (atau beberapa) metode.
Bart Kiers
2
Untuk menjawab "Mengapa tidak menggunakan commons-lang? Ini memiliki banyak barang berharga yang berguna." pertanyaan dengan contoh nyata. Xiaomi mengirimkan versi usang commons-lang pada perangkat Android-nya. Termasuk versi yang lebih baru di aplikasi Anda mengarah ke konflik classloader, jadi commons-lang tidak lagi dapat digunakan dalam proyek Android apa pun.
Nachi
1
@Nachi bahkan jika StringUtils.leftPad yang sudah usang seharusnya ada
Lluis Martinez
29

Inilah yang dia benar-benar minta, saya yakin:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

keluaran:

000Apple

sumber
Tidak berfungsi untuk kasus umum; jika Anda mengganti "Apple" dengan string yang panjangnya 8 karakter (yang mungkin dalam kasus OP) ini melempar a DuplicateFormatFlagsException(karena 00dalam format string). Jika Anda mengganti string yang lebih panjang dari 8 karakter, ini menghasilkan IllegalFormatFlagsException(karena angka negatif).
nbrooks
Anda benar, tetapi bagaimana dengan ini String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); ? Sekarang Anda tidak akan memiliki pengecualian ini.
Abhinav Puri
Hanya ingin menambahkan String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);itu SALAH, seharusnya begitu String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@ user4231709 Solusi hebat! +1
user1697575
25

Anda dapat menggunakan metode String.format seperti yang digunakan dalam jawaban lain untuk menghasilkan string 0,

String.format("%0"+length+"d",0)

Ini dapat diterapkan untuk masalah Anda dengan secara dinamis menyesuaikan jumlah 0 di dalam string format:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

Ini masih merupakan solusi yang berantakan, tetapi memiliki keuntungan bahwa Anda dapat menentukan panjang total dari string yang dihasilkan menggunakan argumen integer.

ChadyWady
sumber
17

Menggunakan Stringskelas utilitas Guava :

Strings.padStart("Apple", 8, '0');
Olivier Grégoire
sumber
15

Anda bisa menggunakan ini:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
Bency Baby
sumber
Sejauh ini jawaban terbaik. Apache commons StringUtils adalah perpustakaan sederhana namun sangat membantu.
Zoidberg
Ini menghemat banyak waktu dan rapi dan bersih juga.
Abhishek
9

Saya sudah dalam situasi yang sama dan saya menggunakan ini; Cukup ringkas dan Anda tidak perlu berurusan dengan panjang atau perpustakaan lain.

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

Sederhana dan rapi. Format string kembali " Apple"jadi setelah mengganti spasi dengan nol, ini memberikan hasil yang diinginkan.

Erdi İzgi
sumber
Kemudian Anda mungkin ingin membagi string terlebih dahulu, menerapkan operasi di atas ke nilai split pertama, daripada menggabungkan nilai-nilai split lainnya.
Erdi İzgi
6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();
robert_x44
sumber
1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}
Arne Deutsch
sumber
1

Anda mungkin harus menjaga edgecase. Ini adalah metode generik.

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}
pembual
sumber
1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}
Fathah Rehman P
sumber
1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}
Nabil_H
sumber
Sementara potongan kode ini diterima, dan dapat memberikan bantuan, itu akan sangat ditingkatkan jika menyertakan penjelasan tentang bagaimana ia menjawab pertanyaan. Tanpa itu, jawaban Anda memiliki nilai pendidikan yang jauh lebih rendah - ingat bahwa Anda akan menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang! Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
Toby Speight
1

Di Jawa:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

Dalam Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

Anda juga dapat menjelajahi cara di Java 8 untuk melakukannya menggunakan aliran dan mengurangi (mirip dengan cara saya melakukannya dengan Scala). Ini sedikit berbeda dengan semua solusi lain dan saya sangat menyukainya.

Carlos
sumber
0

Ini cepat & bekerja berapa pun panjangnya.

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}
Deian
sumber
0

Bisa lebih cepat daripada Chris Lercher menjawab ketika sebagian besar di String memiliki 8 karakter

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

dalam kasus saya di komputer saya 1/8 lebih cepat.

Kuguar6
sumber
0

Ini adalah versi sederhana "tanpa skrip yang dapat dibaca" dari API yang saya gunakan untuk pra-padding sebuah string. (Sederhana, Mudah Dibaca, dan Dapat Disesuaikan).

while(str.length() < desired_length)
  str = '0'+str;
Tezra
sumber
0

Adakah yang mencoba solusi Java murni ini (tanpa SpringUtils):

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

Sayangnya solusi ini hanya berfungsi jika Anda tidak memiliki spasi kosong dalam sebuah string.

Gico
sumber
0

Jika Anda ingin menulis program dalam Java murni, Anda dapat mengikuti metode di bawah ini atau ada banyak Utilitas Tali untuk membantu Anda lebih baik dengan fitur yang lebih canggih.

Dengan menggunakan metode statis sederhana, Anda dapat mencapainya seperti di bawah ini.

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

Anda dapat menggunakan metode di atas addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

Outputnya akan menjadi 000Apple

Googlian
sumber
-3

Itu tidak cantik, tetapi berhasil. Jika Anda memiliki akses apache commons saya sarankan menggunakannya

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
mR_fr0g
sumber
2
The -1 mungkin karena ini adalah contoh yang tidak begitu baik: Anda menggunakan "angka ajaib" dan merangkai Strings, sesuatu yang harus diganti dengan menggunakan StringBuilder atau StringBuffer.
Bart Kiers