Correct format string for String.format or similar

后端 未结 4 854
梦如初夏
梦如初夏 2021-02-05 01:21

I\'m sure I\'ve seen String.format used like this before:

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

Does this ring

相关标签:
4条回答
  • 2021-02-05 01:45

    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.

    0 讨论(0)
  • 2021-02-05 01:52

    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));
    }
    
    0 讨论(0)
  • 2021-02-05 01:59

    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);
    
    0 讨论(0)
  • 2021-02-05 02:08

    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}.

    0 讨论(0)
提交回复
热议问题