Java String.format参数索引不一致
在Java中,可以使用String.Format函数生成格式化字符串。您还可以使用格式字符串中的Java String.format参数索引不一致,java,string,indexing,string-formatting,Java,String,Indexing,String Formatting,在Java中,可以使用String.Format函数生成格式化字符串。您还可以使用格式字符串中的i$按您希望的顺序引用函数的参数,其中i是所引用参数的索引。不幸的是,它似乎并不完全一致,因为以下两行代码产生相同的精确结果: String.format("My name is %0$s and I am %2$d years old", "Joe", 20); String.format("My name is %1$s and I am %2$d years old", "Joe", 20);
i$
按您希望的顺序引用函数的参数,其中i
是所引用参数的索引。不幸的是,它似乎并不完全一致,因为以下两行代码产生相同的精确结果:
String.format("My name is %0$s and I am %2$d years old", "Joe", 20);
String.format("My name is %1$s and I am %2$d years old", "Joe", 20);
为什么0和1都引用同一个元素?它不是应该是严格基于1的索引而不是基于零的索引吗?看起来它不识别
0$
,因为索引从1开始。因此,它根据%s
的位置获取参数。在这里,您的%0$s
是参数的第一个引用,因此它接受第一个参数Joe
您可以运行并查看以下各项之间的差异:
String.format("%s %1$s %2$d", 1, 20, 13);
Output: 1, 1, 20
String.format("%s %0$s %2$d", 1, 20, 13);
Output: 1, 20, 20
JVM可能比您更聪明。它可能认识到只有一个参数符合%d格式,并相应地匹配。@duffymo情况并非如此。这里是与索引
0
和1
匹配的Joe
,而不是整数参数是的,只有20个匹配的十进制格式。我仍然感到非常困惑,为什么它会以这种方式实现,因为像这样的东西可能会有不一致的输出:String.format(“%s,%0$s,%1$s,%2$s,%3$s,%4$s”, 1, 2, 3, 4, 5);但是我接受你的答案。