我敢肯定我以前见过String.format
这样使用过:
String.format("Some {1}, {2}, {3}", var1, var2, var3);
这会为任何人敲响警钟吗?也许我在想 C#,有没有办法在 java 中实现同样的目标?
我知道您可以执行以下操作:
String.format("Some %s, %d, %s", aString, aNumber, aString)
但我追求的语法是前者......
我敢肯定我以前见过String.format
这样使用过:
String.format("Some {1}, {2}, {3}", var1, var2, var3);
这会为任何人敲响警钟吗?也许我在想 C#,有没有办法在 java 中实现同样的目标?
我知道您可以执行以下操作:
String.format("Some %s, %d, %s", aString, aNumber, aString)
但我追求的语法是前者......
您正在寻找的是MessageFormat
,它使用给定的格式和输入参数,例如
MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);
正如已经提到的,String.format
仍然可以使用替代语法来完成这项工作,但它的功能不那么强大,而不是你所要求的。
我不喜欢同时指定参数索引或其类型 - 主要是在抛出异常并为其准备消息时。我喜欢 SLF4j 的做法。所以我像这样包装了 org.slf4j.helpers.MessageFormatter:
public static String subst(String string, Object...objects) {
return MessageFormatter.arrayFormat(string, objects).getMessage();
}
然后你可以像这样使用它:
public void main(String[] args) {
throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}
是的,这是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}
。
如果你想使用空的占位符(没有位置),你可以在 周围写一个小工具Message.format()
,像这样
String format(String s, Object... var2) {
int i = 0;
while(s.contains("{}")) {
s = s.replaceFirst(Pattern.quote("{}"), "{"+ i++ +"}");
}
return MessageFormat.format(s, var2);
}
然后,可以像这样使用它,
format("Some {} {} {}", var1, var2, var3);