Understanding the $ in Java's format strings
JavaFormatterJava 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 string4$
= 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? :)