Understanding the $ in Java's format strings

JavaFormatter

Java Problem Overview


 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"

In this case, why is a 2 appended to $?

Java Solutions


Solution 1 - Java

The 2 has nothing to do with the $:

  • %     =   Start of format string
  • 4$   =   Fourth argument ('d')
  • 2     =   width of two (right-aligned)
  • s     =   type of String

Solution 2 - Java

The 2$ means put the second argument from the list here. The $ follows a number not precedes it. Similarly, 4$ means put the forth argument here.

To clarify, we can break down the %2$2s format into its parts:

  • % - indicates this is a format string

  • 2$ - shows the second value argument should be put here

  • 2 - the format is two characters long

  • s - format the value as a String

You can find more information in the documentation.

Solution 3 - Java

Those are positional arguments where %4$2s signals to format the fourth argument as a string with width 2. This is especially helpful when providing strings for localization where arguments need to be reordered without touching the source code.

> 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

Solution 4 - Java

%: format string

4$: fourth value argument

2: width (length when argument is printed)

s: it's a string argument conversion

for example, the following snippet:

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);

produces an output of :

-    d-    c-    b-    a-

(width of 5 characters per argument, padded with spaces)

and replacing 5 with 2, will produce the following output:

- d- c- b- a-

See the difference? :)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionandandandandView Question on Stackoverflow
Solution 1 - JavaSven LilienthalView Answer on Stackoverflow
Solution 2 - JavaDave WebbView Answer on Stackoverflow
Solution 3 - JavaJoeyView Answer on Stackoverflow
Solution 4 - JavaRahul MishraView Answer on Stackoverflow