2010-06-30 38 views
12

問題has been answered for integers printed in decimal format零,但我正在尋找一個優雅方式做整數同樣在非十進制格式(如二進制,八進制,十六進制)。左填充整數(非十進制格式)在Java

這樣的字符串的生成是容易的:

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

將創建一個String與整數值12345的八進制represenation但如何字符串已經像10位數字,除了計算對其進行格式化,以便需要零的數量並手工組裝一個新的字符串。

一個典型的用例是創建具有固定位數(如16,32,...)的二進制數字,其中人們希望所有數字包括前導零。

+2

「優雅」解決方案的意思是庫函數。我認爲沒有比計算所需的零和預串聯它們更優雅的解決方案。 無論如何,如果有一個數學技巧/算法來做你想做的事情,它將是不同的二進制和八進制和十六進制... – pakore

+0

@pakore - 是的,你是對的,一些'庫'功能已經存在在Java API中對我來說會是'最優雅的') - 我只是討厭一次又一次地重新實現這個填充代碼。 –

+0

好吧,看看NumberFormat類,用方法填充OctalFormat,HexFormat和BinaryFormat類,創建一個特徵提議,提交你的代碼,等待幾個月,升級你的庫,然後你將擁有它作爲庫函數:)。 或者您可以爲您的項目創建自己的庫助手:P – pakore

回答

5

這個怎麼樣(標準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

非常感謝!這是一個很容易記住的模式! –

+5

Ew。這並沒有明確說明它在做什麼,它根本不靈活。如果你想避免一個庫只寫你自己的字符串填充方法,並完成它。我當然不想記住這樣的「模式」,我絕對不希望看到它在代碼中使用多個地方。 – ColinD

+0

@ColinD - 我部分同意。如果我需要在應用程序上下文填充,那麼我可能會包含番石榴。但對於所有這些小片段和試驗,Jespers解決方案就是我尋找的。 –

13

隨着Guava你可以這樣寫:

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

華僑城和十六進制,它是那麼容易,因爲String.format

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

yes..but ..我正在尋找一種通用的方法,使用任何給定的基數(具有實際的上限,因爲我們需要字母來表示數字,就像在十六進制值中一樣) –

2

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

ColinD發佈的Guava示例非常漂亮。

3

打印出來一個十六進制數字,例如,用零填充:

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

會給下面的輸出,與包括填充:

000004d2 

八進制的相關的格式字符代替,X將可能也是這樣。