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

84
 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?

andandandand
источник

Ответы:

134

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

  • %     = Начало строки формата
  • 4$   = Четвертый аргумент ('d')
  • 2     = ширина двух (с выравниванием по правому краю)
  • s     = тип строки
Свен Лилиенталь
источник
Это действительно четкое объяснение, спасибо. Однако, когда я использую% 4 $ 2s и значение моего аргумента ABCDEFGH, он не извлекает только 2 символа. Получил полную строку. Почему?
kandarp 07
49

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

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

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

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

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

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

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

Дэйв Уэбб
источник
На самом деле он был отвергнут, когда это был неправильный ответ. Как теперь правильно, голос против удален.
Свен Лилиенталь
1
@Sven - Ответ никогда не менялся, я думаю, вы, должно быть, неправильно его прочитали. Я добавил, но не изменил никакого содержания.
Дэйв Уэбб,
Что ж, когда я проголосовал против, он прочитал: «2 $ означает поместить сюда второй аргумент из списка». Это не то, что я считаю правильным ответом.
Свен Лилиенталь
Он по-прежнему говорит именно это сейчас, и вы сказали, что теперь это правильно.
Дэйв Уэбб
Само по себе это неправильно или, по крайней мере, не отвечать на вопрос, но в контексте, это правильно.
Свен Лилиенталь
4

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

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

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

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

Джоуи
источник
Тем не менее, мне больше нравятся строки формата .NET, поскольку они делают позицию аргументов более понятной.
Джои
4

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

4$: четвертый аргумент значения

2: width (длина при выводе аргумента)

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-

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

Рахул Мишра
источник