我确信我之前看过String.format
这样的用法:
String.format("Some {1}, {2}, {3}", var1, var2, var3);
这会给任何人敲响任何铃声吗?也许我在想C#,有没有办法在java中实现相同的目标?
我知道你可以这样做:
String.format("Some %s, %d, %s", aString, aNumber, aString)
但我所追求的语法是针对前者的......
答案 0 :(得分:36)
您正在寻找的是MessageFormat
,它使用给定的格式和输入参数,例如
MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);
正如已经提到的那样,String.format
仍然可以使用备用语法完成工作,但它的功能不强,而不是你要求的。
答案 1 :(得分:12)
是的,这是 C#的典型format字符串。在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}
。
答案 2 :(得分:8)
我不喜欢指定参数索引或其类型 - 主要是在抛出异常并为其准备消息时。我喜欢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));
}
答案 3 :(得分:-2)
如果要使用空的占位符(无位置),可以在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);