我确定我曾经见过这样使用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} occurred due to {1}
。
另一种方法是使用Java的String Templates功能。 它在JEP 430中有描述,并且作为JDK 21中的预览功能出现。以下是一个使用示例:
String s = STR."Some \{aString}, \{aNumber}, \{aString}";
String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'";
ResultSet rs = conn.createStatement().executeQuery(query);
PreparedStatement ps = DB."SELECT * FROM Person p WHERE p.last_name = \{name}";
ResultSet rs = ps.executeQuery();
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);