2016-03-01 75 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,这将与字符串再次格式化。