了解Java格式字符串中的$


84
 StringBuilder sb = new StringBuilder();
 // Send all output to the Appendable object sb
 Formatter formatter = new Formatter(sb, Locale.US);

 // Explicit argument indices may be used to re-order output.
 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
 // -> " d  c  b  a"

在这种情况下,为什么在$后面附加2?

Answers:


132

2无关$

  • %     =格式字符串的开头
  • 4$   =第四个参数('d')
  • 2     =两个的宽度(右对齐)
  • s     =字符串类型

那真的很清楚的解释,谢谢。但是,当我使用%4 $ 2s并且参数值为'ABCDEFGH'时,它不会仅检索2个字符。它检索了完整的字符串。为什么?
kandarp

49

2$方法将列表中的第二个参数放在此处。该$ 遵循其人数不得先于它。同样,4$意味着在这里提出论点。

为了明确起见,我们可以将%2$2s格式分为以下几个部分:

  • % -表示这是格式字符串

  • 2$ -显示第二个值参数应放在此处

  • 2 -格式为两个字符长

  • s -将值格式化为字符串

您可以在文档中找到更多信息。


当答案错误时,它实际上被否决了。现在是正确的,删除​​了downvote。
Sven Lilienthal,2009年

1
@Sven-答案从未改变,我认为您一定读错了。我已添加但未更改任何内容。
Dave Webb

好吧,当我拒绝投票时,它显示为:“ 2 $表示将列表中的第二个参数放在此处。” 那不是我认为正确的答案。
Sven Lilienthal,

它仍然说的很准确,而您说的现在是正确的。
戴夫·韦伯

就其本身而言,这是错误的,或者至少没有回答问题,但从上下文来看,这是正确的。
Sven Lilienthal,2009年

4

这些是位置参数,在位置%4$2s信号中将第四个参数格式化为宽度为2的字符串。这在为本地化提供字符串时特别有用,在其中需要对参数进行重新排序而不触动源代码。

用于表示日期和时间的类型的格式说明符具有以下语法:

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

可选的argument_index是一个十进制整数,指示参数在参数列表中的位置。第一个参数由引用"1$",第二个参数由"2$"等等。—格式化程序文档


不过,我更喜欢.NET的格式字符串,因为它们使参数的位置更加清晰。
乔伊,

4

%:格式字符串

4$:第四个值参数

2:宽度(打印参数时的长度)

s:这是字符串参数转换

例如,以下代码段:

StringBuffer sb=new StringBuffer();

Formatter formatter=new Formatter(sb,Locale.UK);

formatter.format("-%4$5s-%3$5s-%2$5s-%1$5s-", "a", "b", "c", "d");

System.out.println(sb);

产生以下输出:

-    d-    c-    b-    a-

(每个参数的宽度为5个字符,并用空格填充)

并替换52,将产生以下输出:

- d- c- b- a-

看到不同?:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.