String.format或类似的正确格式字符串

时间:2012-08-26 18:07:57

标签: java string formatting

我确信我之前看过String.format这样的用法:

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

这会给任何人敲响任何铃声吗?也许我在想C#,有没有办法在java中实现相同的目标?

我知道你可以这样做:

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

但我所追求的语法是针对前者的......

4 个答案:

答案 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);