2017-07-07 19 views
0
設置寬度和墊整witdth字符串格式化

鑑於我有以下的整數:如何在Java中

1, 10, 100 

我想墊他們與零有3碼:

001 
010 
100 

我想打印它們的前綴爲10個空格:

 001 //assume 10 spaces from the beginning of the line 
     010 
     100 

我想要t o使用Java formatter string來完成此操作,但只能成功完成其中一個上述提及條件,但不能同時執行

下面是2個表達我創建的完成這些條件每一個:

@Test 
    public void test1() { 

     String[] langs = { "TEXTX", "TEXTXXX", "TEXTXX" }; 
     int[] nums = {1, 10, 100}; 

     for (int i = 0; i < 3; i++) { 

      String s = langs[i]; 
      int n = nums[i]; 

      System.out.printf("%1$s%2$14s%3$03d\n", s, " ", n); 
     } 

    } 

根據文檔格式器串具有以下形式:

%[argument_index$][flags][width][.precision]conversion 

但顯然零填充標誌參數不能跟隨寬度參數,因爲它被解析爲導致「長寬度」的一個數字。

如何重寫以完成上述條件?

注意

我唯一的想法就是一個空格明確添加到爭論和試圖操縱它作爲參數。事情是這樣的:

System.out.printf("%1$s%2$10s%3$03d\n", s, " ", n); 

編輯

我的道歉,我才意識到,我並沒有充分說明我的問題。這些數字需要遵循不同長度的某些其他字符串,像這樣:

textX  001 
textXXX  010 
textXX  100 

從而使間距是可變的

+1

正在打印的所有數<= 999?如果是這樣的話,你可以用固定的10個空格字符串作爲前綴... –

+0

你想用@空格填充長度爲10的空格,還是隻需在@Jiri建議的前面添加10個空格? –

+0

@TimBiegeleisen請參閱我的編輯 –

回答

3

如果兩個唯一指標分析10個空格和數字的零填充的填充:從OP更新後

final String str = String.format("%10s%03d", " ", 2); 

編輯:

System.out.printf("%-10s%03d", "abc", 2); 

工作原理:

我們需要兩個參數用於我們的模式,一個用於長度爲10的字符串,另一個用於整數。我們添加-%-10s。第二個參數是我們想要填充的長度爲3的整數零:%03d

如果我們不想重新排列或重複使用多個格式說明符的參數,只需按照模式中指定的順序傳遞參數即可。

+1

現貨!非常感謝。根據我對格式化程序字符串語法的理解,它看起來像是一起使用了2個格式化程序字符串?所以'-'把它左對齊到字符串的開頭,而不是像我想的那樣是前一個字符。 –

+0

實際上再看一遍,我不確定它是如何工作的。你能簡單解釋一下嗎?它看起來像是將寬度設置爲字符串('%-10s')而不是整數。你也不需要使用'argument_index $'指向每個參數嗎? –

+0

我已添加一些說明。是的,寬度是爲字符串和整數單獨設置的。 – msfoster

0

這個答案是基於您最新的編輯,這揭示了這個數據:

textX  001 
textXXX  010 
textXX  100 

,假設第二列總有3寬度,那麼你的問題提煉下來搞清楚有多少空間需要在第一個文本列之後添加。這裏是你如何在Java 7中做到這一點:

String text = "textXXX"; 
int n = 10 - text.length(); 
String padding = String.format("%0" + n + "d", 0).replace("0", " "); 

在Java 8,你可以這樣來獲得填充串:

String padding = String.join("", Collections.nCopies(n, " "));