为什么 String.Format("%1s","") 不会返回 "" 而是 " "?

6
String.format("%1s","").equals("")); // --> return false !
String.format("%1s","").equals(" ")); // --> return true !
  • 为什么会发生这种情况?
  • 空间从哪里来?

您是否已经查看了 String.format 的文档?这种行为恰好符合规范。 - Mark Peters
1
我实际上对于 %1$s 格式说明符感到困惑,但它确实如所指定的那样。 - C4stor
3个回答

13

在格式说明符中,通过最小宽度值1来指定空格。

String.format("%1s","").equals(" ")
                ^

哇。我还以为这与传递的参数顺序有关呢。谢谢。 - C4stor
+1。具体来说,1是一个宽度,即(来自Javadoc)“要写入输出的最小字符数”。 - ruakh
1
@C4stor:你想的是%1$s。美元符号在参数索引后是必需的。 - ruakh
@C4stor 对的 - 在许多情况下,百分号后面的数字确实表示参数索引,但仅当该索引后面跟着美元符号时才是如此:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax - Craig Otis

3

你想像这样添加一个参数索引

String.format("%1$s", ""); //returns ""
String.format("%2$s %1$s", "a", "b"); //returns "b a"

你的代码定义了一个“宽度”

String.format("%3s", ""); // returns "   ";
String.format("%3s", "a"); // returns "  a";
String.format("%-3s", "a"); // returns "a  ";

阅读此内容以获取更多信息: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax


1

%1s 是一种没有任何参数的格式说明符。没有参数的格式说明符的通用语法如下:

%[flags][width]conversion

在此,

可选的标志是一组字符,用于修改输出格式。有效标志的集合取决于转换。

可选的宽度是一个非负十进制整数,表示要写入输出的最小字符数。

因此,1 指定了宽度,这里是为什么会得到 " " 而不是 "" 的描述:

宽度是要写入输出的最小字符数。如果转换后的值的长度小于宽度,则输出将通过 ' ' (\u0020) 填充,直到总字符数等于宽度。默认情况下,填充在左侧。如果给出了 '-' 标志,则填充将在右侧。如果未指定宽度,则没有最小值。

PS:\u0020 是代表空格的 Unicode 字符。

希望这能帮助到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接