将整数格式化为%d和%s有什么区别?

12

这两种写法在语法上都是正确的,但是它们之间是否存在任何重要的基本差异需要我们关注呢?

String result = String.format("Here is a number - %s", someIntValue);

vs:

String result = String.format("Here is a number - %d", someIntValue);

在这两种情况下,someIntValue 都是一个 int 类型的变量?


1
s 只是将字符串打印出来,而 d 则仅适用于十进制整数,并且可以应用多个选项(例如左侧填充为 0 等)。 - Lino
4个回答

11

格式说明请参见文档

对于%s

如果arg实现了Formattable接口,则会调用arg.formatTo方法。否则,将调用arg.toString()方法得到结果。

Integer没有实现Formattable接口,因此会调用toString方法。

对于%d

结果将以十进制数字形式进行格式化。

在大多数情况下,两者的结果相同。但是,%d也受Locale的影响。例如,在印地语中,100000将被格式化为१०००००(天城文数字)。

您可以运行以下简短代码片段查看具有“非标准”输出的语言环境:

for (Locale locale : Locale.getAvailableLocales())
{
    String format = String.format(locale, "%d", 100_000);

    if (!format.equals("100000")) System.out.println(locale + " " + format);
}

不一定相同,这取决于Locale。 - jbx
2
泰国语是教科书般的例子。https://docs.oracle.com/javase/tutorial/i18n/locale/create.html - jbx

6
%s 实际上会调用对象的toString()方法。所以大多数情况下,您将始终得到整数本身。 %d 通知格式化程序它实际上是一个整数。如果例如使用具有不同数字系统的Locale,则可能需要遵守特定于区域设置的格式。
演示了差异的演示(%n 生成依赖于操作系统的换行符):
Locale.setDefault(new Locale("th", "TH", "TH"));
System.out.printf("%s %n", 42); //output: 42
System.out.printf("%d %n", 42); //output: ๔๒

1
在你的情况下没有区别,但通常情况下,如果您不确定要格式化的值的类型,则使用%s是有意义的。

你怎么可能不知道值的类型(除非你只是传递 Object 类型的东西... 呕)?这可不是 PHP ;) - jbx
正好适用于传递类型为Object的对象,或者如果您想格式化通用类型的变量 ;) - GiorgosDev
好的,我不会说这些是“一般”的情况。但是对于通用类型可能会有用。但是,如果您的应用程序与语言环境有关,则使用此方法将会出现问题。 - jbx

-2

其实没有区别,因为整数会被视作字符串!在 String.format() 中,你不能用 %d 来代表字符串,但是可以用 %s 来代表整数。 甚至可以使用 System.out.printf() 来打印整数,该整数将会被解析成字符串。


不,它们并不总是相同的。 - jbx
我在谈论这个特定的案例! - MasterBlasterCoder
是的,在这种情况下,您不知道代码是否在泰国计算机上运行,并将其默认区域设置为泰国数字,或者在英语计算机上运行,或者其他语言。因此,情况并不总是相同的。 - jbx
@jbx 公平地说,在这种特殊情况下,OP的格式字符串是“这里有一个数字 - %s”。介绍数字的文本是英文,因此数字也应该用英文打印。 - DodgyCodeException
2
是的,这是真的。但问题的整个目的在于了解在使用其中一个而不是另一个时应该知道哪些细节,因为在“常见”的(西方)计算机设置下,它们似乎表现相同。OP明确提到了应该注意的潜在差异。 - jbx

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