Android 动态字符串:%1d 对比 %1$d

Android Dynamic String: %1d vs %1$d

包含 $ 的格式字符串有区别吗?

%1d 对比 %1$d

我注意到在应用程序代码中我们同时使用了这两种方法,而且似乎都可以正常工作。

或者顺便说一句,使用 %1d to %2d%1$d to %2$d

参见 java.util.Formatter ...它被称为 "explicit argument indices"。

在引用 1 个索引时,这没有区别,因为无法更改顺序。最常见的用途可能是在传递一个参数的同时在同一个字符串中替换两次。

完整的模式看起来像这样:

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

对于有同样问题的人:他们不一样

对于发布的示例:

%1d to %2d vs %1$d to %2$d

正如 Martin 分享的那样,格式模式是:

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

通过不放置 $,正则表达式对以下正则表达式参数使用 %1%2 等。

flags 需要一些特定的值,因此 12 被用作 width 参数,它指定了 最小宽度。如果您继续使用相同的模式,您最终会得到如下内容:

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

当然,由于正在使用 width 参数,因此 %number 不会按要求表示参数顺序:

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

%d - just display number

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

%1d - display number with information how much space should be "reserved" (at least one)

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

%9d - reserve "9" chars (if number will be shorter - put spaces there) and align to right

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

%-9d - same as above but align to LEFT (this minus is important)

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

%1$d - use (in format) position of the element from varargs (so you can REUSE elements instead of passing them two times)

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

%1d - mix two of them. Get first parameter (1$) and reserve nine chars (%9d)

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