Java 什么';将整数格式化为%d和%s之间的区别是什么?
虽然两者在语法上都是有效的,但以下两者之间是否存在任何重要的潜在差异:Java 什么';将整数格式化为%d和%s之间的区别是什么?,java,string,Java,String,虽然两者在语法上都是有效的,但以下两者之间是否存在任何重要的潜在差异: String result = String.format("Here is a number - %s", someIntValue); vs: 在这两种情况下,someIntValue都是int?格式设置程序语法,请参阅 对于%s: 如果arg实现了Formattable,则arg.formatTo为 调用。否则,将通过调用arg.toString()获得结果 Integer未实现Formattable,因此调用toS
String result = String.format("Here is a number - %s", someIntValue);
vs:
在这两种情况下,someIntValue
都是int
?格式设置程序语法,请参阅
对于%s
:
如果arg实现了Formattable
,则arg.formatTo
为
调用。否则,将通过调用arg.toString()
获得结果
Integer
未实现Formattable
,因此调用toString
对于%d
:
结果的格式为十进制整数
在大多数情况下,结果是相同的。但是,%d
也受区域设置的约束。例如,在印地语中,100000将被格式化为१००००० ()
您可以运行此短代码段以查看具有“非标准”输出的区域设置:
%s
实际上将调用对象的toString()
方法。所以很可能你总是得到整数
%d
正在通知格式化程序它实际上是一个整数。例如,如果使用具有不同数字系统的区域设置
,则可能需要遵守特定于区域设置的格式
对于说明差异的演示(%n
生成依赖于操作系统的行分隔符):
在您的情况下没有区别,但一般来说,如果您不确定格式化的值的类型,则使用%s是有意义的。没有区别,两者都是相同的,因为整数将被视为字符串!
不能将%d用于String,但可以将%s用于String.format中的int!
您甚至可以使用System.out.printf()打印int,整数将被简单地解析为字符串。s
仅将其打印为字符串,而d
仅用于十进制整数,并且可以使用多个选项应用(例如,使用0的左填充等)不一定相同。这取决于当地的情况。泰国的是教科书上的例子。不,他们不总是一样的。我在谈论这个特殊的案例!是的,在这种特殊情况下,您不知道代码是在泰国计算机上运行的,其默认区域设置为泰语编号,还是英语编号,或者其他语言。所以它并不总是一样的。@jbx公平地说,在这种特殊情况下,OP的格式字符串是“这是一个数字-%s”。介绍数字的文字是英文的,因此数字也应该用英文印刷。是的,这是真的。但这个问题的全部目的是为了了解在使用其中一个而不是另一个时,人们是否应该知道一些细节,因为从表面上看,在“普通”(西方)计算机设置下,它们的行为似乎是相同的。OP明确提到了人们应该注意的潜在差异。你怎么会不知道值的类型(除非你只是传递Object
…恶心)类型的东西?这不是PHP;)完全适用于传递Object类型的对象时,或者如果要格式化泛型类型的变量;)好吧,我不会说这些是“一般”情况。但是,对于泛型类型,是的可能很有用。但是,如果您的应用程序对区域设置敏感,那么如果您使用这种方法,您将陷入困境。
String result = String.format("Here is a number - %d", someIntValue);
for (Locale locale : Locale.getAvailableLocales())
{
String format = String.format(locale, "%d", 100_000);
if (!format.equals("100000")) System.out.println(locale + " " + format);
}
Locale.setDefault(new Locale("th", "TH", "TH"));
System.out.printf("%s %n", 42); //output: 42
System.out.printf("%d %n", 42); //output: ๔๒