Java中的字符串格式化

3

最近我使用 Python 太多了,忘记了 Java 中是否有这样的方法:

print "I am a %s" % string

我在谷歌上搜索了,但是当你不知道每种语言中这个叫什么时,很难找到像这样简单的东西。


5
你尝试过用你在问题中提到的标题搜索吗?http://www.google.com/search?q=string+formatting+in+java 我搜索过了,但由于不知道具体名称,所以很困难。 - Mark Byers
嗯,我想我假设它应该是一个我可以从“”中调用的方法,而不是使用Java String类。太多的语言=\ - Falmarri
3个回答

10

有两种简单的方法可以做到:

String yourStringHere = "human";
System.out.println(String.format("I am a %s", yourStringHere));
或者
System.out.printf("I am a %s\n", yourStringHere);
注意,printf() 不会打印换行符,所以你需要手动添加 ("\n")。但是(感谢 BalusC),你也可以在格式化字符串中使用 "%n"。它将被替换为默认的系统换行符。(因此:String.format("I am a %s%n", yourString))两者都会打印出 I am a human\n
在Java中,这被称为格式化。还可以查看 String.format()

4
您还可以使用“%n”来表示平台默认的换行符。这样更有利于跨平台兼容性 :) - BalusC
@BalusC:哦!谢谢,我不知道。我以后会使用%n - Martijn Courteaux

4
System.out.println( "I am a " + string );

但我更喜欢这个:
System.out.println( String.format( "I am a %s", string ) );

第一个实际上是国际化缺陷,因为你只是简单地连接值。永远不要使用它。第二个更好一些,但如果你有两个字符串值,也就是说你必须使用两个"%s"占位符,那么它也会成为国际化缺陷:翻译人员将无法重新排序句子。 - Paweł Dyda
@Paweł Dyda,您能否详细说明一下第一个问题的原因吗?是因为单词需要重新排序吗?例如,如果术语永远不会被重新排序,比如(“我的名字是:”+姓名),那么它仍然是一个问题吗?实际上,在应用程序中嵌入字符串本身就是一个问题——如果您没有这样做,那么我认为+和%s将是相同的。也许我还漏掉了其他方面? - Bill K
@Bill K:是的,那是因为整个句子可能需要重新排序。不幸的是,你不能说永远不会重新排序的术语存在。根据目标语言,可能需要重新排序。我敢打赌,在阿拉伯语(从右到左的书写系统)中,它应该看起来像:“你的名字:我的名字是”。至于硬编码字符串,这也是不好的做法,但我假设这一点是显而易见的。不正确的字符串连接则不是。 - Paweł Dyda
使用String.format()比使用字符串、整数、双精度等缩写的字符串拼接要慢。 - Martijn Courteaux

2
您可以使用MessageFormat.format()来实现此操作,但在此情况下,您应该使用{0}而不是%s。
System.out.print(MessageFormat.format("I am a {0}", string));

如果您希望本地化您的程序,这是更好的方式(或更糟糕,具体取决于您想要实现什么),因为它会自动使用本地化数字格式。


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