Розуміння рядків $ у форматі 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?

Відповіді:


132

The не 2має нічого спільного з $:

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

Це справді чітке пояснення, дякую. Однак, коли я використовую% 4 $ 2s і моє значення аргументу 'ABCDEFGH', воно не отримує лише 2 символи. Він отримав повний рядок. Чому?
kandarp

49

Засіб 2$поміщає тут другий аргумент зі списку. $ Слід число , не передує йому. Подібним чином, 4$засоби викладають тут четвертий аргумент.

Для уточнення ми можемо розбити %2$2sформат на його частини:

  • % - вказує, що це рядок формату

  • 2$ - показує, що тут слід помістити другий аргумент значення

  • 2 - формат складає два символи

  • s - відформатувати значення як Рядок

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


Це було фактично проти, коли це була неправильна відповідь. Як зараз правильно, голос проти вилучено.
Свен Лілієнталь,

1
@Sven - Відповідь ніколи не змінилася, я думаю, ви, мабуть, прочитали її неправильно. Я додав, але не змінив жодного вмісту.
Dave Webb

Що ж, коли я проголосував проти, читалося: "Значення 2 $ поміщає тут другий аргумент зі списку". Це не те, що я вважав би правильною відповіддю.
Свен Лілієнталь

Це все ще говорить саме це зараз, і ви сказали, що це зараз правильно.
Дейв Вебб

Саме по собі це неправильно або, принаймні, не відповідає на запитання, але якщо ввести в контекст, це правильно.
Sven Lilienthal

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-

Бачите різницю? :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.