40

我敢肯定我以前见过String.format这样使用过:

String.format("Some {1}, {2}, {3}", var1, var2, var3);

这会为任何人敲响警钟吗?也许我在想 C#,有没有办法在 java 中实现同样的目标?

我知道您可以执行以下操作:

String.format("Some %s, %d, %s", aString, aNumber, aString)

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

4

4 回答 4

52

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

MessageFormat.format("Some {0}, {1}, {2}", var1, var2, var3);

正如已经提到的,String.format仍然可以使用替代语法来完成这项工作,但它的功能不那么强大,而不是你所要求的。

于 2012-08-26T18:15:03.470 回答
20

我不喜欢同时指定参数索引或其类型 - 主要是在抛出异常并为其准备消息时。我喜欢 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));
}
于 2016-08-31T08:24:40.790 回答
13

是的,这是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}

于 2012-08-26T18:09:15.993 回答
-3

如果你想使用空的占位符(没有位置),你可以在 周围写一个小工具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);
于 2020-05-26T13:02:23.083 回答