【问题标题】:Java String.format args indexing inconsistencyJava String.format args 索引不一致
【发布时间】:2018-01-12 07:35:39
【问题描述】:

在 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);

为什么 0 和 1 都指向同一个元素?它不应该是严格从 1 开始的索引而不是从零开始的索引吗?

【问题讨论】:

  • JVM 可能比你聪明。它可能会识别出只有一个参数适合 %d 格式并进行相应匹配。
  • @duffymo 并非完全如此。这里是Joe 与索引01 匹配,而不是整数参数
  • 是的,只有十进制格式化程序的 20 个匹配项

标签: java string indexing string-formatting


【解决方案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

【讨论】:

  • 我仍然觉得它为什么要这样实现非常令人费解,因为这样的事情可能会产生不一致的输出:String.format("%s, %0$s, %1$s, %2$s, %3$s, %4$s", 1, 2, 3, 4, 5); 但我接受你的答案作为答案。
猜你喜欢
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多