ฉันจะปัดจำนวนเต็มด้วยศูนย์ทางซ้ายได้อย่างไร


1022

คุณจะปล่อย pad intด้วยค่าศูนย์เมื่อแปลงเป็น a Stringใน java ได้อย่างไร?

โดยทั่วไปแล้วฉันต้องการหาจำนวนเต็มจนถึง9999ศูนย์นำหน้า (เช่น 1 = 0001)


2
ใช่นั่นแหล่ะ! ไม่ดีของฉัน ... ฉันพิมพ์ลงในโทรศัพท์ของฉัน คุณไม่จำเป็นต้องใช้ "สตริงใหม่": Integer.toString (NUM + 10,000). SubString (1) ใช้งานได้
Randyaa

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

1
ดูstackoverflow.com/questions/35521278/…สำหรับวิธีแก้ปัญหาพร้อมไดอะแกรม
bvdb

มีปัญหากับnew String(Integer.toString(num + 10000)).substring(1)วิธีการหากnumมีขนาดใหญ่กว่า 9999 แม้ว่า ijs
Felype

คำตอบ:


1695

ใช้java.lang.String.format(String,Object...)แบบนี้:

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

สำหรับศูนย์ padding มีความยาว 5. สำหรับการส่งออกเลขฐานสิบหกแทนที่dที่มีในขณะที่x"%05x"

java.util.Formatterตัวเลือกการจัดรูปแบบเต็มรูปแบบได้รับการบันทึกเป็นส่วนหนึ่งของ


1
ฉันควรคาดหวังว่าตัวเลือกString.formatที่จะคล้ายกับ printf () ใน C?
Ehtesh Choudhury

13
ถ้าคุณต้องทำสิ่งนี้เพื่อรายการค่าจำนวนมากประสิทธิภาพของ DecimalFormat จะดีกว่าอย่างน้อย 3 เท่าของ String.format () ฉันกำลังดำเนินการปรับประสิทธิภาพตัวเองและเรียกใช้สองใน Visual VM แสดงวิธีการ String.format () วิธีการสะสมเวลา CPU ที่ประมาณ 3-4 เท่าของอัตรา DecimalFormat.format ()
Steve Ferguson

10
และเพื่อเพิ่มมากกว่า 9 ศูนย์ใช้สิ่งที่ต้องการ%012d
Mohammad Banisaeid

2
นี่สำหรับ Java 5 ขึ้นไป สำหรับ DecimalFormat 1.4 และต่ำกว่าเป็นทางเลือกตามที่แสดงไว้ที่นี่javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

1
หวัดดี! ฉันมีปัญหาในการใช้:%d can't format java.lang.String arguments
Helio Soares Junior

116

สมมติว่าคุณต้องการพิมพ์11เป็น011

คุณสามารถใช้ของ Formatter"%03d" :

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถใช้ฟอร์แมตเตอร์แบบนี้:

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

อีกวิธีหนึ่งบางวิธี java สนับสนุนรูปแบบเหล่านี้โดยตรง

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

5
@ Omar Koohei แน่นอน แต่มันอธิบายถึงเหตุผลเบื้องหลัง "ค่าคงที่เวทย์มนตร์"
bvdb

คำตอบที่ดี! เพียงแค่แสดงความคิดเห็นในFรูปแบบ () ควรจะเป็น:f String.format(...);
David Miguel

ถ้าฉันไม่ต้องการต่อท้ายเลข 0 นำหน้า แต่เป็นตัวอักษร / หมายเลขอื่นล่ะ ขอบคุณ
chiperortiz

1
@chiperortiz afaik ไม่สามารถทำได้ด้วยเครื่องมือการจัดรูปแบบด้านบน ในกรณีนั้นฉันคำนวณอักขระนำหน้าที่ต้องการ (เช่นint prefixLength = requiredTotalLength - String.valueOf(numericValue).length) จากนั้นใช้วิธีสตริงซ้ำเพื่อสร้างส่วนนำหน้าที่ต้องการ มีหลายวิธีในการทำซ้ำสตริง แต่ไม่มีจาวาแบบดั้งเดิม, afaik: stackoverflow.com/questions/1235179/…
bvdb

114

หากคุณใช้เหตุผลใดก็ตามก่อน 1.5 จาวาอาจลองด้วยวิธี Apache Commons Lang

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

29

พบตัวอย่างนี้ ... จะทดสอบ ...

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

ทดสอบสิ่งนี้และ:

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

การทำงานทั้งสองเพื่อจุดประสงค์ของฉันฉันคิดว่า String รูปแบบดีกว่าและรวบรัดมากขึ้น


1
ใช่ฉันจะแนะนำ DecimalFormat เพราะฉันไม่รู้เกี่ยวกับ String.format แต่จากนั้นฉันเห็นคำตอบของ uzhin String.format ต้องใหม่
พอลทอมบลิ

มันคล้ายกับวิธีที่คุณทำใน. Net ยกเว้น. net จะดูดีกว่าสำหรับตัวเลขขนาดเล็ก
Omar Kooheji

ในกรณีของฉันฉันใช้ตัวเลือกแรก (DecimalFormat) เพราะหมายเลขของฉันคือ Double
mauronet

21

หากประสิทธิภาพเป็นสิ่งสำคัญในกรณีของคุณคุณสามารถทำได้ด้วยตัวเองด้วยค่าใช้จ่ายน้อยลงเมื่อเทียบกับString.formatฟังก์ชัน:

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

ประสิทธิภาพ

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

ผลลัพธ์

ฟังก์ชั่นของตัวเอง: 1697ms

String.format: 38134ms


1
ข้างต้นมีการกล่าวถึงการใช้ DecimalFormat ที่เร็วขึ้น คุณมีบันทึกใด ๆ เกี่ยวกับเรื่องนี้หรือไม่?
Patrick

@ แพทริกสำหรับประสิทธิภาพทศนิยมรูปแบบดูเพิ่มเติมได้ที่: stackoverflow.com/questions/8553672/…
Stephan

Shocking! มันเป็นถั่วที่ฟังก์ชั่นทำงานได้ไม่ดีนัก ฉันต้องเป็นศูนย์และแสดงคอลเลกชันของ int ที่ไม่ได้ลงนามซึ่งสามารถอยู่ระหว่าง 1 ถึง 3 หลัก มันจำเป็นต้องทำงานอย่างรวดเร็ว ฉันใช้วิธีการง่าย ๆ นี้: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";มันใช้ได้ผลเร็วมาก (ขอโทษที่ฉันไม่ได้ใช้มัน!)
BuvinJ

ประสิทธิภาพการทำงานเปรียบเทียบได้อย่างไรหลังจากที่ HotSpot ทำงานได้ดีพอที่จะทำให้มันร้าวหรือไม่
ฟิล

16

คุณสามารถใช้Google Guava :

Maven:

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

รหัสตัวอย่าง:

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

บันทึก:

Guavaเป็นห้องสมุดที่มีประโยชน์มากก็ยังมีจำนวนมากของคุณสมบัติที่เกี่ยวข้องกับCollections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBusฯลฯ

Ref: GuavaExplained


1
ตัวอย่างโค้ดข้างต้นเป็นการใช้งานเท่านั้นไม่ใช่ตัวอย่างรหัสจริงๆ ความคิดเห็นสะท้อนถึงสิ่งนี้คุณจะต้อง "String myPaddedString = Strings.padStart (... )"
JoeG

2
วิธีนี้ให้ผลการทำงานที่ดีขึ้นกว่า JDK String.format / MessageFormatter / DecimalFormatter
rafalmag

10

ลองอันนี้:

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

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

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

หากคุณต้องการพิมพ์ข้อความที่จัดรูปแบบโดยตรงบนหน้าจอ


1
แต่ OP ไม่เคยขอมัน ภายในString.formatและSystem.out.formatเรียกการjava.util.Formatterใช้งานเดียวกัน
bsd

... และ System.out สามารถเปลี่ยนเส้นทาง
ฟิล

1

ใช้คลาส DecimalFormat ดังนี้:

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

เอาท์พุท: 0000811


1

DecimalFormatนี่คือวิธีการที่คุณสามารถจัดรูปแบบสายของคุณโดยไม่ต้องใช้

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

09

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

019

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

0119


0

ตรวจสอบรหัสของฉันที่ใช้งานได้สำหรับจำนวนเต็มและสตริง

สมมติว่าตัวเลขแรกของเราคือ 2 และเราต้องการเพิ่มศูนย์ลงไปดังนั้นความยาวของสตริงสุดท้ายจะเป็น 4 เพื่อให้คุณสามารถใช้รหัสต่อไปนี้

    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])ทำไม
Isaac

replace("\0", "0")อะไรคือสิ่งที่
Isaac

@Isaac - ก่อนอื่นฉันสร้างอาร์เรย์ถ่านและใช้อาร์เรย์อักขระนั้นฉันสร้างสตริง จากนั้นฉันแทนที่อักขระ null (ซึ่งเป็นค่าเริ่มต้นของประเภทถ่าน) ด้วย "0" (ซึ่งเป็นถ่านที่เราต้องการที่นี่สำหรับการขยาย)
Fathah Rehman P

0

คุณต้องใช้ตัวจัดรูปแบบรหัสต่อไปนี้ใช้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));

ขาออก: 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);
}

ปัญหาเดียวของวิธีนี้คือมันทำให้คุณใส่หมวกความคิดของคุณเพื่อค้นหาว่ามันทำงานอย่างไร


5
ปัญหาเฉพาะ? ลองด้วยค่าลบnumberหรือwidthมากกว่า 18
user85421

2
จุดดี. และฉันเดาว่ามันจะทำมากกว่าที่ขอเพราะมันตัดที่ความกว้าง (ซึ่งไม่ได้ขออย่างชัดเจน แต่เป็นสิ่งจำเป็นโดยทั่วไป) มันเป็นความอัปยศที่ Java (ช้ากว่าการเปรียบเทียบอย่างเจ็บปวด) String.format () ไม่สนับสนุนความกว้างของตัวแปรและไม่สนับสนุนความแม่นยำเลยสำหรับตัวระบุจำนวนเต็ม
johncurrier

-3

ไม่ต้องใช้แพ็คเกจ:

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

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


1
อืม ... ฉันชอบมัน
Kartik Chugh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.