可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm sure I've seen String.format
used like this before:
String.format("Some {1}, {2}, {3}", var1, var2, var3);
Does this ring any bells for anyone? Maybe I'm thinking of C#, is there a way of achieving the same in java?
I know you can do something like:
String.format("Some %s, %d, %s", aString, aNumber, aString)
but the syntax I'm after is for the former...
回答1:
What you are looking for is MessageFormat
, which uses a given format and input parameters, e.g.
MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);
And as already mentioned, String.format
can still do the job using the alternate syntax, but it is less powerful in functionality and not what you requested.
回答2:
I do not like to specify both index of parameter or its type - mainly when throwing exception and preparing message for it. I like way SLF4j does it. So I wrapped org.slf4j.helpers.MessageFormatter like this:
public static String subst(String string, Object...objects) {
return MessageFormatter.arrayFormat(string, objects).getMessage();
}
Then you can use it like this:
public void main(String[] args) {
throw new RuntimeException(MyUtils.subst("Problem with A={} and B={}!", a, b));
}
回答3:
Yes, that's the typical format string of C#. In Java, you can use the latter, that is, String.format("%s %d %d", ...)
.
An alternative is to use MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3)
, which uses the .NET curly braces notation, as mentioned by @Tobias, though it requires you to import java.text.MessageFormat
. They are also more appropriate for when you are dealing with localized resources, where you typically have external .properties
files with messages in the format Error {0} ocurred due to {1}
.
回答4:
If you want to use empty placeholders (without positions), you could write a small utility around Message.format()
, like this
String format(String s, Object... var2) {
int i = 0;
while(s.contains("{}")) {
s = s.replaceFirst(Pattern.quote("{}"), "{"+ i++ +"}");
}
return MessageFormat.format(s, var2);
}
And then, can use it like,
format("Some {} {} {}", var1, var2, var3);