这两种写法在语法上都是正确的,但是它们之间是否存在任何重要的基本差异需要我们关注呢?
String result = String.format("Here is a number - %s", someIntValue);
vs:
String result = String.format("Here is a number - %d", someIntValue);
在这两种情况下,someIntValue
都是一个 int
类型的变量?
格式说明请参见文档。
对于%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);
}
%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: ๔๒
Object
类型的东西... 呕)?这可不是 PHP ;) - jbx其实没有区别,因为整数会被视作字符串!在 String.format() 中,你不能用 %d 来代表字符串,但是可以用 %s 来代表整数。 甚至可以使用 System.out.printf() 来打印整数,该整数将会被解析成字符串。
s
只是将字符串打印出来,而d
则仅适用于十进制整数,并且可以应用多个选项(例如左侧填充为 0 等)。 - Lino