วิธีการจัดรูปแบบสตริง Java ที่มีศูนย์นำหน้า?


192

นี่คือสตริงตัวอย่าง:

"Apple"

และฉันต้องการเพิ่มศูนย์เพื่อเติมเต็ม 8 ตัวอักษร:

"000Apple"

ฉันจะทำเช่นนั้นได้อย่างไร

คำตอบ:


287

ในกรณีที่คุณต้องทำโดยไม่ได้รับความช่วยเหลือจากห้องสมุด:

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

(ใช้งานได้ตราบใดที่สตริงของคุณไม่เกิน 8 ตัวอักษร)


21
มันค่อนข้างฉลาด - แต่ใช้เวลาประมาณ 30 วินาทีในการ "เอา" ฉันคิดว่าวิธีแก้ปัญหาที่อ่านได้จะดีกว่า
Amy B

2
นี่เป็นโซลูชันที่ยอดเยี่ยมเมื่อคุณฝังซอฟต์แวร์ลงในบางสิ่งที่ไม่มีพื้นที่มากและไลบรารี่พิเศษก็ไม่ใช่ตัวเลือก ขอบคุณ !!
Casey Murray

รุ่นนี้เร็วอย่างบ้าคลั่ง! ฉันรักมัน.
Dakkaron

2
@Mathu อย่างสุจริตที่ไม่ยากที่จะเข้าใจ สองสตริงถูกต่อกัน (รวมเข้าด้วยกัน) และแยก 5 อักขระแรกจากนั้น ไม่มีเวทมนต์ ไม่สมเหตุสมผลในกรณีนี้ (สำหรับสตริงคงที่ Apple) แต่เข้าใจง่าย ("0000" + theString).substring(theString.length())เป็นจริงมากขึ้น แผ่นนี้theStringมีศูนย์นำ ขออภัยไม่สามารถต้านทานการเพิ่มความคิดเห็น :)
HankCa

1
โซลูชันนี้มีไวยากรณ์สั้น ๆ แต่ไม่ใช่ "เร็วเร็ว" หากคุณโชคดีคอมไพเลอร์จะปรับให้เหมาะสม แต่โดยหลักแล้ววิธี "รวดเร็ว" ของจริงในการทำเช่นนี้คือการใช้ a StringBuilderและใช้การวนซ้ำเพื่อเติม หากความต้องการนั้นจริง ๆ แล้วตัดทอนสายอักขระ 8 ตัวเท่านั้นก็โอเคแม้ว่าจะเป็นกรณีการใช้งานที่แคบมาก แต่โซลูชันนี้ไม่สามารถเรียกได้ว่ารวดเร็ว มันสั้นมาก
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);
    }
}

14
แต่ฉันต้องการเพิ่มศูนย์นำหน้าก่อนที่สตริงแทนที่จะเป็น int
Roy

1
คุณสามารถใช้ StringUtils หรือ DecimalFormat สำหรับ Java 1.4 และด้านล่าง ตรวจสอบที่นี่javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag ใช้%07s แทน%07d, FormatFlagsConversionMismatchExceptionคุณจะได้รับ คุณสามารถลอง
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

นี้เป็นจากคอมมอน-lang ดู javadoc


3
ทำไมไม่ใช้คอมมอนส์ lang มันมีของแถมที่มีประโยชน์มากมาย
Bozho

7
แม้ว่าคุณจะไม่สามารถใช้คอมมอนส์ - lang คุณสามารถคัดลอกแหล่งที่มาจาก StringUtils เพื่อสร้างฟังก์ชันของคุณเอง นั่นจะเป็นคำตอบทั่วไปที่ดีกว่าคำตอบที่เลือก docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
จะเป็นเช่นไรหากเป็นวิธีการเดียวที่ห้องสมุดใช้ บางทีไลบรารี่ที่เพิ่มเข้ามานั้นใหญ่กว่าแอพที่เคยใช้มาหลายต่อหลายครั้งฉันนึกภาพออกไม่ได้ว่ามีเหตุผลอะไรที่จะไม่เพิ่มไลบรารี่ทั่วไปในแอปพลิเคชัน อย่าเข้าใจฉันผิด: ฉันเห็นด้วยมันมีสิ่งที่มีประโยชน์มาก แต่ฉันเข้าใจถึงความไม่เต็มใจที่จะใช้แอปที่เต็มไปด้วย JAR ภายนอกถ้าผลประโยชน์ไม่จำเป็นต้องเขียนวิธีการเพียงหนึ่ง (หรือสองคู่)
Bart Kiers

2
หากต้องการตอบ"ทำไมไม่ใช้คอมมอนส์ - แลงมันมีของแถมที่มีประโยชน์" คำถามด้วยตัวอย่างที่เป็นรูปธรรม Xiaomi จัดส่งคอมมอนส์ lang แบบเก่าบนอุปกรณ์ Android การรวมเวอร์ชันที่ใหม่กว่าในแอปของคุณนำไปสู่ข้อขัดแย้งของตัวโหลดคลาสดังนั้นคอมมอนส์ lang จะไม่สามารถใช้ในโครงการ Android ใด ๆ ได้อีกต่อไป
Nachi

1
@Nachi แม้ว่า StringUtils.leftPad ที่ล้าสมัยควรมีอยู่จริง
Lluis Martinez

29

นี่คือสิ่งที่เขาขอจริงๆฉันเชื่อว่า:

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

เอาท์พุท:

000Apple

ใช้งานไม่ได้กับกรณีทั่วไป หากคุณแทนที่ "Apple" ด้วยสตริงที่มีความยาว 8 ตัวอักษร (ซึ่งเป็นไปได้ในกรณีของ OP) จะเป็นการโยน a DuplicateFormatFlagsException(เพราะ00ในสตริงรูปแบบ) หากคุณแทนที่สตริงที่มีความยาวมากกว่า 8 ตัวอักษรสิ่งนี้จะส่งIllegalFormatFlagsException(เนื่องจากจำนวนลบ)
nbrooks

คุณมีสิทธิ String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); แต่สิ่งที่เกี่ยวกับเรื่องนี้แล้ว: ตอนนี้คุณจะไม่มีข้อยกเว้นนี้
Abhinav Puri

แค่อยากจะเพิ่มเป็นธรรมมันควรจะเป็นString.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9);

@ user4231709 สุดยอดวิธีแก้ปัญหา! +1
user1697575

25

คุณสามารถใช้วิธีการ String.format ตามที่ใช้ในคำตอบอื่นเพื่อสร้างสตริงของ 0

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

สิ่งนี้สามารถนำไปใช้กับปัญหาของคุณได้โดยการปรับจำนวนนำหน้า 0 ในสตริงรูปแบบ:

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

มันยังคงเป็นวิธีที่ยุ่ง แต่มีข้อดีที่คุณสามารถระบุความยาวทั้งหมดของสตริงผลลัพธ์โดยใช้อาร์กิวเมนต์จำนวนเต็ม



15

คุณสามารถใช้สิ่งนี้:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

โดยคำตอบที่ดีที่สุด Apache Commons StringUtils เป็นห้องสมุดที่เรียบง่าย แต่มีประโยชน์อย่างยิ่ง
Zoidberg

สิ่งนี้ช่วยประหยัดเวลาได้มากและก็สะอาดและเรียบร้อยเช่นกัน
Abhishek

9

ฉันอยู่ในสถานการณ์ที่คล้ายคลึงกันและฉันใช้สิ่งนี้ มันค่อนข้างกระชับและคุณไม่ต้องจัดการกับความยาวหรือห้องสมุดอื่น

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

เรียบง่ายและเรียบร้อย รูปแบบสตริงส่งคืน" Apple"ดังนั้นหลังจากแทนที่ช่องว่างด้วยศูนย์จะให้ผลลัพธ์ที่ต้องการ


จากนั้นคุณอาจต้องการแยกสตริงก่อนใช้การดำเนินการด้านบนกับค่าการแยกแรกแทนที่จะต่อส่วนที่เหลือของค่าการแยก
Erdi İzgi



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

1

คุณอาจจะต้องดูแล edgecase นี่เป็นวิธีการทั่วไป

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

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

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

ขณะที่ข้อมูลโค้ดนี้คือการต้อนรับและอาจให้ความช่วยเหลือบางส่วนก็จะได้รับการปรับปรุงอย่างมากถ้ามันรวมถึงคำอธิบายของวิธีการที่มันอยู่ในคำถาม หากไม่มีคำตอบของคุณจะมีคุณค่าทางการศึกษาน้อยลง - โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่เพียงแค่คนที่ถามตอนนี้! โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Toby Speight

1

ใน Java:

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

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

ในสกาล่า:

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

คุณยังสามารถสำรวจวิธีใน Java 8 เพื่อทำโดยใช้สตรีมและลด (คล้ายกับวิธีที่ฉันใช้กับ Scala) มันแตกต่างจากโซลูชันอื่น ๆ ทั้งหมดและฉันชอบมันมากโดยเฉพาะ


0

นี่เร็วและใช้ได้กับทุกความยาว

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

0

ทำได้เร็วกว่าChris Lercher ตอบเมื่อส่วนใหญ่ใน String มี exacly 8 ถ่าน

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

ในกรณีของฉันบนเครื่องของฉัน 1/8 เร็วขึ้น


0

นี่คือเวอร์ชัน "สคริปต์ที่อ่านง่าย" แบบง่าย API ที่ฉันใช้สำหรับการเติมสายล่วงหน้า (ง่ายอ่านและปรับได้)

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

0

ไม่มีใครลองใช้โซลูชัน Java ที่แท้จริงนี้ (โดยไม่ต้อง 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");

น่าเสียดายที่โซลูชันนี้ใช้งานได้เฉพาะเมื่อคุณไม่มีช่องว่างในสตริง


0

ถ้าคุณต้องการที่จะเขียนโปรแกรมในจาวาบริสุทธิ์คุณสามารถทำตามวิธีการด้านล่างหรือมี String Utils จำนวนมากเพื่อช่วยให้คุณดีขึ้นด้วยคุณสมบัติขั้นสูงเพิ่มเติม

การใช้วิธีสแตติกแบบง่ายคุณสามารถทำได้ดังนี้

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

คุณสามารถใช้วิธีการข้างต้น addLeadingText(length, padding text, your text)

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

ผลลัพธ์จะเป็น000Apple


-3

มันไม่สวย แต่ใช้งานได้ หากคุณมีการเข้าถึง apache ทั่วไปฉันขอแนะนำให้ใช้ที่

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
-1 น่าจะเป็นเพราะนี่เป็นตัวอย่างที่ไม่ค่อยดีนัก: คุณกำลังใช้ "หมายเลขเวทมนตร์" และกำลังต่อสาย Strings สิ่งที่ควรแทนที่ด้วยการใช้ StringBuilder หรือ StringBuffer
Bart Kiers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.