2010-06-30 43 views
12

Câu hỏi has been answered for integers printed in decimal format, nhưng tôi đang tìm kiếm một nhã cách để làm điều tương tự với số nguyên trong dạng phi thập phân (như nhị phân, bát phân, hex).số nguyên đệm Left (định dạng phi thập phân) với số không trong Java

Tạo Strings như vậy là dễ dàng:

String intAsString = Integer.toString(12345, 8); 

sẽ tạo ra một chuỗi với represenation bát phân của giá trị số nguyên 12345. Nhưng làm thế nào để định dạng nó để String có như 10 chữ số, ngoài việc tính toán số lượng số không cần thiết và lắp ráp một chuỗi mới 'bằng tay'. Một trường hợp sử dụng điển hình sẽ tạo ra các số nhị phân với số bit cố định (như 16, 32, ...) trong đó một số muốn có tất cả các chữ số bao gồm số 0 đứng đầu.

+2

Ý của bạn cho giải pháp "thanh lịch" là chức năng thư viện. Tôi nghĩ rằng không có giải pháp thanh lịch hơn so với tính toán các số không cần thiết và trước khi ghép chúng lại. Dù sao, nếu có một thủ thuật Toán/thuật toán để làm những gì bạn muốn làm, nó sẽ khác nhau cho nhị phân và bát phân và hex ... – pakore

+0

@pakore - vâng, bạn nói đúng, một số chức năng 'thư viện' đã có mặt trong Java API sẽ là 'thanh lịch nhất' đối với tôi;) - Tôi chỉ ghét reimplementing mã padding này một lần nữa và một lần nữa. –

+0

Vâng, hãy xem lớp NumberFormat, tạo ra một lớp OctalFormat, HexFormat và BinaryFormat với các phương thức 0, tạo đề xuất tính năng, gửi mã của bạn, chờ một vài tháng, nâng cấp thư viện của bạn và sau đó bạn sẽ có nó như một hàm thư viện :). Hoặc bạn có thể tạo trình trợ giúp thư viện của riêng bạn cho dự án của bạn: P – pakore

Trả lời

5

Làm thế nào về vấn đề này (tiêu chuẩn Java):

private final static String ZEROES = "0000000000"; 

// ... 

String s = Integer.toString(12345, 8); 
String intAsString = s.length() <= 10 ? ZEROES.substring(s.length()) + s : s; 
+0

Cảm ơn rất nhiều! Đó là một mô hình đủ dễ nhớ! –

+5

Ew. Điều này không nói rõ những gì nó đang làm, và nó không linh hoạt chút nào. Nếu bạn muốn tránh một thư viện chỉ cần viết phương pháp đệm chuỗi của riêng bạn và được thực hiện với nó. Tôi chắc chắn sẽ không muốn nhớ một "mô hình" như thế này và tôi hoàn toàn không muốn thấy nó được sử dụng nhiều nơi trong mã. – ColinD

+0

@ColinD - Tôi đồng ý một phần. Nếu tôi cần padding trong một bối cảnh ứng dụng sau đó tôi sẽ có thể bao gồm ổi. Nhưng đối với tất cả những đoạn trích nhỏ và thử nghiệm, giải pháp Jespers là những gì * I * đang tìm kiếm. –

13

Với Guava bạn chỉ có thể viết:

String intAsString = Strings.padStart(Integer.toString(12345, 8), 10, '0'); 
20

Đối Tháng Mười và hex, nó dễ dàng như String.format:

assert String.format("%03x", 16) == "010"; 
assert String.format("%03o", 8) == "010"; 
+0

yes..but ..Tôi đã tìm kiếm một cách tiếp cận chung, làm việc với bất kỳ radix đã cho (với giới hạn trên thực tế bởi vì chúng ta cần chữ cái để đại diện cho chữ số, giống như trong các giá trị hex) –

2

Đây là giải pháp thay thế có thể tái sử dụng nhiều hơn với sự giúp đỡ của StringBuilder.

public static String padZero(int number, int radix, int length) { 
    String string = Integer.toString(number, radix); 
    StringBuilder builder = new StringBuilder().append(String.format("%0" + length + "d", 0)); 
    return builder.replace(length - string.length(), length, string).toString(); 
} 

Ví dụ về guava được đăng bởi ColinD theo cách khá mượt mà.

3

in ra một số HEX, ví dụ, với ZERO padding:

System.out.println(String.format("%08x", 1234)); 

sẽ cung cấp cho các đầu ra sau đây, với sự đệm bao gồm:

000004d2 

Thay thế x với nhân vật định dạng liên quan đến bát phân của sẽ làm như vậy, có thể.

Các vấn đề liên quan