理解Java格式字符串中的$符号

96
 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?
4个回答

155

2$无关:

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

1
非常清晰的解释,谢谢。然而,当我使用%4$2s并且我的参数值为“ABCDEFGH”时,它没有仅检索2个字符。它检索了整个字符串。为什么? - kandarp
2 = 两个的宽度(右对齐) - mvmn

50
2$ 表示将列表中的第二个参数放置在此处。在数字之后使用 $ 而不是在前面使用它。类似地,4$ 表示将第四个参数放在此处。
为了澄清,我们可以将 %2$2s 格式拆分为以下几个部分:
  • % - 表示这是一个格式化字符串

  • 2$ - 指定应该在这里放置第二个值参数

  • 2 - 格式化字符串有两个字符长度

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

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

当时它是错误答案,所以被踩了。现在它是正确的,所以踩赞被移除了。 - Sven Lilienthal
1
@Sven - 答案从未改变,我认为你可能读错了。我已经添加了内容,但没有更改任何内容。 - David Webb
当我给它点了踩后,它显示:“2$ 的意思是将列表中的第二个参数放在这里。” 这不是我认为正确答案的定义。 - Sven Lilienthal
现在它仍然完全是那样,而您已经说它现在是正确的。 - David Webb
本身来说,它是错误的或者至少没有回答问题,但放到上下文中,它是正确的。 - Sven Lilienthal

4

这些是位置参数,其中%4$2s表示使用宽度为2的字符串格式化第四个参数。这在为本地化提供字符串时非常有帮助,因为需要重新排序参数而不用触及源代码。

The format specifiers for types which are used to represents dates and times have the following syntax:

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

The optional argument_index is a decimal integer indicating the position of the argument in the argument list. The first argument is referenced by "1$", the second by "2$", etc. —Formatter documentation


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

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个字符的宽度,左右使用空格填充)

5替换为2,将产生以下输出:

- d- c- b- a-

看到区别了吗? :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接