String.format或类似的正确格式字符串

aus*_*ser 28 java string formatting

我相信我以前见过这样的String.format用过:

String.format("Some {1}, {2}, {3}", var1, var2, var3);
Run Code Online (Sandbox Code Playgroud)

这对任何人都响铃吗?也许我在想C#,有没有办法在java中实现相同的目标?

我知道你可以这样做:

String.format("Some %s, %d, %s", aString, aNumber, aString)
Run Code Online (Sandbox Code Playgroud)

但我追求的语法是前者...

Tob*_*sse 37

您正在寻找的是MessageFormat,它使用给定的格式和输入参数,例如

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);
Run Code Online (Sandbox Code Playgroud)

正如已经提到的,String.format仍然可以使用备用语法来完成工作,但它在功能上的功能不强,而不是您请求的功能.

  • 做了一些研究:String.format实际上比MessageFormat更新。他们确实使用了不同的方法,但是总体功能没有太大差异。因此,据说String.format更快。 (2认同)

Joã*_*lva 12

是的,这是C#的典型格式字符串.在Java中,您可以使用后者,即.String.format("%s %d %d", ...)

另一种方法是使用MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3),使用.NET大括号表示法,如@Tobias所述,但它要求您导入java.text.MessageFormat.它们也更适合于处理本地化资源时,您通常在外部.properties文件中包含格式化的消息Error {0} ocurred due to {1}.


Jar*_*boš 10

我不喜欢指定参数索引或其类型 - 主要是在抛出异常并为其准备消息时.我喜欢SLF4j这样做的方式.所以我像这样包装了org.slf4j.helpers.MessageFormatter:

public static String subst(String string, Object...objects) {
    return MessageFormatter.arrayFormat(string, objects).getMessage();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

public void main(String[] args) {
    throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}
Run Code Online (Sandbox Code Playgroud)