2016-03-01 79 views
0

如何在格式化字符串時設置動態寬度和精度?我知道下面的代碼很好用,但我們如何以格式化的方式來做到這一點?Java格式具有動態寬度和精度的字符串

int len = 3; 
String s = "Andy"; 
System.out.printf("%1$" + len + "." + len + "s%n", s); 

Output: 
And 

我試過這個。它沒有拋出錯誤,但是輸出的值不是預期的。 (它看起來那麼亂,但我試圖通過「len個」以寬度和精度,這是它。:))

System.out.printf("%2$%1$d.%1$ds%n", len, s); 

Output: 
%1$d.3s 

是否可行?如果是這樣,我們如何能得到與前者相同的輸出?

+1

我會謙虛地驚訝,如果有比你的第一個更好的答案。 –

+0

@Louis,據我所知,但我們通常使用格式化程序來避免字符串連接,更可能這看起來像是再次使用連接。所以我把它放在這裏看看是否有更好的方法。 – svjn

+1

我明白了。我回答你的問題時說:「我很確定沒有。」 –

回答

0

不幸的是,String.format中使用的格式化程序從左向右讀取了字符串,因此它不會注意到生成的新標誌。如果它將從右到左讀取,這將是可能的,但問題會發生在varags上,因爲您可以將許多參數傳遞給方法。

所以唯一的辦法,以類似

String.format("|%ds", 5, "foo") 

格式化輸出

|富

將兩次格式化,這不會是最effecient但最可讀的(這甚至不是真的......)

所以我的解決方案看起來像這樣

String.format(String.format("|%%%ds", 5), "foo") //Here, I add a double % 

第一個格式化程序將返回%5s,這將與字符串再次格式化。