[java] Format a message using MessageFormat.format() in Java

I have stored some messages in a resource bundle. I'm trying to format these messages as follows.

import java.text.MessageFormat;

String text = MessageFormat.format("You're about to delete {0} rows.", 5);
System.out.println(text);

Assume that the first parameter i.e the actual message is stored in a property file which is somehow retrieved.

The second parameter i.e 5 is a dynamic value and should be placed in the placeholder {0} which doesn't happen. The next line prints,

Youre about to delete {0} rows.

The placeholder is not replaced with the actual parameter.


It is the apostrophe here - You're. I have tried to escape it as usual like You\\'re though it didn't work. What changes are needed to make it work?

This question is related to java resourcebundle

The answer is


For everyone that has Android problems in the string.xml, use \'\' instead of single quote.


Here is a method that does not require editing the code and works regardless of the number of characters.

String text = 
  java.text.MessageFormat.format(
    "You're about to delete {0} rows.".replaceAll("'", "''"), 5);

You need to use double apostrophe instead of single in the "You''re", eg:

String text = java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);

Just be sure you have used double apostrophe ('')

String text = java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
System.out.println(text);

Edit:

Within a String, a pair of single quotes can be used to quote any arbitrary characters except single quotes. For example, pattern string "'{0}'" represents string "{0}", not a FormatElement. ...

Any unmatched quote is treated as closed at the end of the given pattern. For example, pattern string "'{0}" is treated as pattern "'{0}'".

Source http://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html


Using an apostrophe (Unicode: \u2019) instead of a single quote ' fixed the issue without doubling the \'.