Понимание $ в строках формата Java - PullRequest
74 голосов
/ 16 декабря 2009
 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 ]

118 голосов
/ 16 декабря 2009

2 не имеет ничего общего с $:

  • % = начало строки формата
  • 4$ = Четвертый аргумент ('d')
  • 2 = ширина двух (по правому краю)
  • s = тип строки
47 голосов
/ 16 декабря 2009

2$ означает поставить второй аргумент из списка здесь. $ следует за числом, не предшествующим ему. Точно так же, 4$ означает поставить четвертый аргумент здесь.

Чтобы уточнить, мы можем разбить формат %2$2s на части:

  • % - указывает, что это строка формата

  • 2$ - показывает, что здесь должен быть указан второй аргумент значения

  • 2 - формат состоит из двух символов

  • s - отформатировать значение в виде строки

Более подробную информацию можно найти в документации .

3 голосов
/ 16 декабря 2009

Это позиционные аргументы, где %4$2s сигнализирует о форматировании четвертого аргумента как строки с шириной 2. Это особенно полезно при предоставлении строк для локализации, где аргументы необходимо переупорядочивать, не касаясь исходного кода. .

Спецификаторы формата для типов, которые используются для представления даты и времени, имеют следующий синтаксис:

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

Необязательный argument_index - это десятичное целое число, обозначающее позицию аргумента в списке аргументов. На первый аргумент ссылается "1$", на второй - "2$" и т. Д. - Документация по форматированию

2 голосов
/ 29 апреля 2013

%: строка формата

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-

Видишь разницу? :)

...