Format a message using MessageFormat.format() in Java
JavaResourcebundleJava Problem Overview
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?
Java Solutions
Solution 1 - Java
Add an extra apostrophe '
to the MessageFormat
pattern String
to ensure the '
character is displayed
String text =
java.text.MessageFormat.format("You''re about to delete {0} rows.", 5);
^
An apostrophe (aka single quote) in a MessageFormat pattern starts a quoted string and is not interpreted on its own. From the javadoc
> A single quote itself must be represented by doubled single quotes '' throughout a String.
The String
You\\'re
is equivalent to adding a backslash character to the String
so the only difference will be that You\re
will be produced rather than Youre
. (before double quote solution ''
applied)
Solution 2 - Java
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
Solution 3 - Java
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);
Solution 4 - Java
Using an apostrophe ā
(Unicode: \u2019
) instead of a single quote '
fixed the issue without doubling the \'
.
Solution 5 - Java
For everyone that has Android problems in the string.xml, use '' instead of single quote.
Solution 6 - Java
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);