English 中文(简体)
Understanding the $ in Java s format strings
原标题:
 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 $?

最佳回答

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
问题回答

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.

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

%: 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? :)





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签