Динамическая строка Android:% 1d против% 1 $ d - PullRequest
1 голос
/ 28 марта 2019

Есть ли разница между строкой формата с включенным $?

%1d против %1$d

Я заметил, что в коде приложения у нас есть оба, и оба, кажется, работаюток.

или, кстати, используя %1d to %2d против %1$d to %2$d

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Для тех, у кого такой же вопрос: ОНИ НЕ ТО ЖЕ

для приведенного примера:

%1d to %2d против %1$d to %2$d

Как поделился Мартин, шаблон формата:

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

Не помещая $, регулярное выражение использует %1, %2 и т. Д. Для следующих аргументов регулярного выражения.

flags нужны некоторые конкретные значения, поэтому 1 и 2 используются в качестве аргумента width, который задает минимальная ширина . Если вы продолжите с тем же шаблоном, вы получите что-то вроде:

String.format("Hello: '%1d' '%2d' '%3d' '%4d'", 1, 2, 3, 4);
==> Hello: '1' ' 2' '  3' '   4'

Конечно, поскольку используется аргумент width, число% не будет соответствовать порядку аргументов, как требуется:

String.format("Hello: '%4d' '%3d' '%2d' '%1d'", 1, 2, 3, 4);
    ==> Hello: '   1' '  2' ' 3' '4'
1 голос
/ 28 марта 2019

%d - просто отобразить номер

int first = 10;
System.out.printf("%d", first);
// output:
// 10

%1d - отобразить номер с информацией о том, сколько места следует «зарезервировать» (как минимумone)

int first = 10;
System.out.printf("->%1d<-", first);
// output:
// ->10<-

%9d - зарезервировать "9" символов (если число будет короче - поставить пробелы) и выровнять по правому краю

int first = 10;
System.out.printf("->%9d<-", first);
// output:
// ->       10<-
//   123456789

%-9d - то же, что и выше, но выравнивание по левому краю (это minus важно)

int first = 10;
System.out.printf("->%-9d<-", first);
// output:
// ->10       <-
//   123456789

%1$d - использовать (вformat) положение элемента из varargs (так что вы можете использовать элементы REUSE вместо двухкратной их передачи)

int first = 10;
int second = 20;
System.out.printf("%1$d %2$d %1$d", first, second);
// output:
// 10 20 10

%1$9d - смешайте два из них.Получить первый параметр (1$) и зарезервировать девять символов (%9d)

int first = 10;
System.out.printf("->%1$9d<-", first);
// output:
// ->       10<-
//   123456789
1 голос
/ 28 марта 2019

см. java.util.Formatter ... это называется "явные индексы аргументов".

, ссылаясь на 1 отдельный индекс, это не имеет значения, поскольку порядок не может быть изменен. наиболее распространенным вариантом может быть замена в одной строке дважды при передаче одного аргумента.

полный шаблон выглядит примерно так:

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