Làm thế nào tôi có thể đệm một số nguyên với số không ở bên trái?


1022

Làm thế nào để bạn rời khỏi pad intvới số không khi chuyển đổi sang Stringjava trong?

Về cơ bản, tôi đang tìm cách loại bỏ các số nguyên lên tới 9999các số 0 đứng đầu (ví dụ 1 = 0001).


2
Đúng rồi, thế đó! xấu của tôi ... tôi đã gõ nó vào điện thoại của tôi. Bạn cũng không cần "Chuỗi mới": Integer.toString (num + 10000) .subString (1) hoạt động.
Randyaa

Long.valueOf ("00003400"). ToString (); Số nguyên.valueOf ("00003400"). ToString (); ---> 3400
frekele

1
xem thêm stackoverflow.com/questions/35521278/ để tìm giải pháp với sơ đồ
bvdb

Có một vấn đề với new String(Integer.toString(num + 10000)).substring(1)cách tiếp cận nếu numlớn hơn 9999, ijs.
Felype

Câu trả lời:


1696

Sử dụng java.lang.String.format(String,Object...)như thế này:

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

đối với phần đệm không có độ dài 5. Đối với đầu ra thập lục phân, thay thế dbằng một xnhư trong "%05x".

Các tùy chọn định dạng đầy đủ được ghi lại như một phần của java.util.Formatter.


1
Tôi có nên mong đợi các tùy chọn String.formatgiống như printf () trong C không?
Ehtesh Choudhury

13
Nếu bạn phải làm điều này cho một danh sách lớn các giá trị, hiệu suất của DecimalFormat tốt hơn ít nhất 3 lần so với String.format (). Tôi đang trong quá trình tự điều chỉnh hiệu năng và chạy hai trong Visual VM cho thấy phương thức String.format () tích lũy thời gian CPU với tốc độ gấp khoảng 3-4 lần so với DecimalFormat.format ().
Steve Ferguson

10
Và để thêm hơn 9 số không, hãy sử dụng cái gì đó như%012d
Mohammad Banisaeid

2
Đây là cho Java 5 trở lên. Cho 1,4 và thấp hơn DecimalFormat là một thay thế như được hiển thị ở đây javadevnotes.com/java-integer-to-opes-with-lead-zeros
JavaDev

1
Chào các cậu! Tôi có một số vấn đề khi sử dụng:%d can't format java.lang.String arguments
Helio Soares Junior

116

Giả sử bạn muốn in 11như011

Bạn có thể sử dụng một định dạng : "%03d".

nhập mô tả hình ảnh ở đây

Bạn có thể sử dụng định dạng này như thế này:

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

Ngoài ra, một số phương thức java hỗ trợ trực tiếp các trình định dạng này:

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

5
@Omar Koohei thực sự, nhưng nó giải thích lý do đằng sau "hằng số ma thuật".
bvdb

Câu trả lời tốt đẹp! Chỉ cần một nhận xét, Fđịnh dạng () sẽ là f: String.format(...);.
David Miguel

Điều gì xảy ra nếu tôi không muốn nối thêm 0 nhưng một chữ cái / số khác? cảm ơn
chiperortiz

1
@chiperortiz afaik không thể thực hiện được với các công cụ định dạng ở trên. Trong trường hợp đó, tôi tính toán các ký tự đầu được yêu cầu (ví dụ int prefixLength = requiredTotalLength - String.valueOf(numericValue).length), sau đó sử dụng phương thức chuỗi lặp lại để tạo tiền tố cần thiết. Có nhiều cách khác nhau để lặp lại chuỗi, nhưng không có java gốc, afaik: stackoverflow.com/questions/1235179/ chủ
bvdb

114

Nếu bạn vì bất kỳ lý do nào, hãy sử dụng Java 1.5 trước thì có thể thử với phương thức Apache Commons Lang

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

29

Tìm thấy ví dụ này ... Sẽ kiểm tra ...

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

Đã thử nghiệm điều này và:

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

Cả hai đều hoạt động, vì mục đích của tôi, tôi nghĩ String.Format tốt hơn và cô đọng hơn.


1
Vâng, tôi sẽ đề xuất DecimalFormat vì tôi không biết về String.format, nhưng sau đó tôi thấy câu trả lời của uzhin. String.format phải mới.
Paul Tomblin

Nó tương tự như cách bạn làm trong .Net Ngoại trừ cách .Net trông đẹp hơn đối với các số nhỏ.
Omar Kooheji

Trong trường hợp của tôi, tôi đã sử dụng tùy chọn đầu tiên (DecimalFormat) vì số của tôi là Double
mauronet

21

Nếu hiệu suất là quan trọng trong trường hợp của bạn, bạn có thể tự làm với ít chi phí hơn so với String.formatchức năng:

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

Hiệu suất

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

Kết quả

Chức năng riêng: 1697ms

Chuỗi.format : 38134ms


1
Ở trên có đề cập đến việc sử dụng DecimalFormat nhanh hơn. Bạn đã có bất kỳ ghi chú về điều đó?
Patrick

@Patrick Để biết hiệu suất của DecimalFormat, xem thêm: stackoverflow.com/questions/8553672/iêu
Stephan

Gây sốc! Đó là các loại hạt hoạt động rất kém. Tôi đã phải zero pad và hiển thị một tập hợp các số nguyên không dấu có thể nằm trong khoảng từ 1 đến 3 chữ số. Nó cần để làm việc nhanh như chớp. Tôi đã sử dụng phương pháp đơn giản này: for( int i : data ) strData += (i > 9 ? (i > 99 ? "" : "0") : "00") + Integer.toString( i ) + "|";Nó hoạt động rất nhanh (xin lỗi tôi đã không làm mất thời gian!).
BuvinJ

Làm thế nào để hiệu suất so sánh sau khi nó được chạy đủ để HotSpot có một vết nứt?
Phil

16

Bạn có thể sử dụng Google Guava :

Maven:

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

Mã mẫu:

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

Ghi chú:

Guavalà thư viện rất hữu ích, nó cũng cung cấp nhiều tính năng mà liên quan đến Collections, Caches, Functional idioms, Concurrency, Strings, Primitives, Ranges, IO, Hashing, EventBus, vv

Tham chiếu: Quả ổi


1
Mã mẫu trên chỉ là cách sử dụng, không thực sự là mã mẫu. Nhận xét phản ánh điều này, bạn sẽ cần "String myPaddedString = String.padStart (...)"
JoeG

2
Phương thức này thực sự cho kết quả hiệu năng tốt hơn nhiều so với JDK String.format / MessageFormatter / DecimalFormatter.
rafalmag

10

Hãy thử cái này:

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

Mặc dù nhiều cách tiếp cận trên là tốt, nhưng đôi khi chúng ta cần định dạng số nguyên cũng như số float. Chúng ta có thể sử dụng điều này, đặc biệt khi chúng ta cần thêm số 0 cụ thể ở bên trái cũng như bên phải của số thập phân.

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

nếu bạn muốn in văn bản được định dạng trực tiếp lên màn hình.


1
Nhưng OP không bao giờ yêu cầu nó. Trong nội bộ String.formatSystem.out.formatgọi cùng java.util.Formatterthực hiện.
bsd

... và System.out có thể được chuyển hướng.
Phil

1

Sử dụng lớp DecimalFormat, như vậy:

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

ĐẦU RA: 0000811


1

Đây là cách bạn có thể định dạng chuỗi của bạn mà không cần sử dụng DecimalFormat.

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

09

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

019

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

0119


0

Kiểm tra mã của tôi sẽ làm việc cho số nguyên và Chuỗi.

Giả sử số đầu tiên của chúng tôi là 2. Và chúng tôi muốn thêm số không vào đó để độ dài của chuỗi cuối cùng sẽ là 4. Để bạn có thể sử dụng mã sau

    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])tại sao
Isaac

replace("\0", "0")... là gì
Isaac

@Isaac - Đầu tiên tôi tạo một mảng char và sử dụng mảng char đó tôi đã tạo một chuỗi. Sau đó, tôi đã thay thế ký tự null (là giá trị mặc định của loại char) bằng "0" (là ký tự chúng ta cần ở đây để đệm)
Fathah Rehman P

0

Bạn cần sử dụng Trình định dạng, mã sau sử dụng 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));

Đầu ra: 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);
}

Vấn đề duy nhất với phương pháp này là nó khiến bạn phải đội chiếc mũ suy nghĩ của mình để tìm ra cách nó hoạt động.


5
Vấn đề duy nhất? Hãy thử nó với âm numberhoặc widthlớn hơn 18.
user85421

2
Điểm tốt. Và tôi đoán nó không được yêu cầu nhiều hơn vì nó cắt ngắn theo chiều rộng (điều này không được yêu cầu rõ ràng nhưng thường là cần thiết). Thật đáng tiếc khi String.format () của Java không hỗ trợ độ rộng thay đổi và hoàn toàn không hỗ trợ độ chính xác cho các bộ xác định số nguyên.
johncurrier

-3

Không có gói cần thiết:

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

Điều này sẽ đệm chuỗi thành ba ký tự và thật dễ dàng để thêm một phần nữa cho bốn hoặc năm. Tôi biết đây không phải là giải pháp hoàn hảo theo bất kỳ cách nào (đặc biệt nếu bạn muốn một chuỗi đệm lớn), nhưng tôi thích nó.


1
Hmm ... tôi thích nó
Kartik Chugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.