具有动态宽度和精度的Java格式字符串

具有动态宽度和精度的Java格式字符串,java,string,formatting,Java,String,Formatting,格式化字符串时如何设置动态宽度和精度?我知道下面的代码很好用,但是我们如何用格式化程序的方式来实现呢 int len = 3; String s = "Andy"; System.out.printf("%1$" + len + "." + len + "s%n", s); Output: And 我试过这个。它没有抛出错误,但打印的值与预期值不同。(看起来很凌乱,但我试着将“len”传递到宽度和精度。就是这样。:) 这可行吗?如果是这样,我们如何获得与前一个相同的输出?不幸的是,Strin

格式化字符串时如何设置动态宽度和精度?我知道下面的代码很好用,但是我们如何用格式化程序的方式来实现呢

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

Output:
And
我试过这个。它没有抛出错误,但打印的值与预期值不同。(看起来很凌乱,但我试着将“len”传递到宽度和精度。就是这样。:)


这可行吗?如果是这样,我们如何获得与前一个相同的输出?

不幸的是,
String.format
中使用的格式化程序从左到右读取字符串,因此它不会注意到生成的新标志。如果从右向左读取,这是可能的,但问题在于varags,因为您可以将许多参数传递给方法

所以,唯一的方法是

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

|福

将是两次格式化,这不是最有效的,而是最可读的(甚至不是真的……)

我的解决方案是这样的

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

第一个格式化程序将返回
%5s
,该格式化程序将再次使用字符串进行格式化。

如果有比第一个更好的答案,我会有点惊讶。@Louis,我理解,但我们通常使用格式化程序来避免字符串串接&这更像是再次使用串接。所以我把它放在这里,看看是否有更好的方法。我明白了。我回答你的问题时说:“我很确定没有。”
 String.format(String.format("|%%%ds", 5), "foo") //Here, I add a double %