Понимание $ в строках формата Java

 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 ответа

Решение

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

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

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

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

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

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

  • 2 - формат длиной два символа

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

Вы можете найти больше информации в документации.

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

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

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

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

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

вывод:

// расстояние 5 символов между двумя символами

    d         c         b           a

и замена 5 на 2, даст следующий результат:

DCBA

Увидеть разницу?:)

Другие вопросы по тегам