如何在 Java 中设置字符串的格式

2022-08-31 05:34:33

原始问题,但我如何格式化字符串,如下所示:

“{2}的步骤{1}”

通过使用Java替换变量?在 C# 中,这很容易。


答案 1

看看 String.format。但是,请注意,它需要类似于C的printf系列函数的格式说明符 - 例如:

String.format("Hello %s, %d", "world", 42);

会返回“Hello world, 42”。在了解格式说明符时,您可能会发现很有帮助。安迪·托马斯-克莱默(Andy Thomas-Cramer)很好心地在下面的评论中留下了这个链接,这似乎指向了官方规范。最常用的是:

  • %s - 插入字符串
  • %d - 插入有符号整数(十进制)
  • %f - 插入实数,标准表示法

这与 C# 完全不同,C# 使用带有可选格式说明符的位置引用。这意味着你不能做这样的事情:

String.format("The {0} is repeated again: {0}", "word");

...无需实际重复传递给 printf/format 的参数。(参见下面The Scrum Meister的评论)


如果您只想直接打印结果,您可能会根据自己的喜好找到System.out.printf(PrintStream.printf)。


答案 2

除了String.format之外,还可以看看java.text.MessageFormat。格式不那么简洁,更接近你提供的 C# 示例,你也可以使用它进行分析。

例如:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

一个更好的例子利用了Java 1.5中的varargs和自动装箱改进,并将上述内容变成了一行:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormat对于使用选择修饰符进行i18nized复数会更好一些。若要指定在变量为 1 且否则为复数时正确使用单数形式的消息,可以执行如下操作:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });