Skip to content

Most visited

Recently visited

navigation
Added in API level 1

MessageFormat

public class MessageFormat
extends Format

java.lang.Object
   ↳ java.text.Format
     ↳ java.text.MessageFormat


Produces concatenated messages in language-neutral way. New code should probably use Formatter instead.

MessageFormat takes a set of objects, formats them and then inserts the formatted strings into the pattern at the appropriate places.

Note: MessageFormat differs from the other Format classes in that you create a MessageFormat object with one of its constructors (not with a getInstance style factory method). The factory methods aren't necessary because MessageFormat itself doesn't implement locale-specific behavior. Any locale-specific behavior is defined by the pattern that you provide as well as the subformats used for inserted arguments.

Patterns and their interpretation

MessageFormat uses patterns of the following form:
 MessageFormatPattern:
         String
         MessageFormatPattern FormatElement String
 FormatElement:
         { ArgumentIndex }
         { ArgumentIndex , FormatType }
         { ArgumentIndex , FormatType , FormatStyle }
 FormatType: one of 
         number date time choice
 FormatStyle:
         short
         medium
         long
         full
         integer
         currency
         percent
         SubformatPattern
 String:
         StringPart<sub>opt</sub>
         String StringPart
 StringPart:
         ''
         ' QuotedString '
         UnquotedString
 SubformatPattern:
         SubformatPatternPart<sub>opt</sub>
         SubformatPattern SubformatPatternPart
 SubFormatPatternPart:
         ' QuotedPattern '
         UnquotedPattern
 

Within a String, "''" represents a single quote. A QuotedString can contain arbitrary characters except single quotes; the surrounding single quotes are removed. An UnquotedString can contain arbitrary characters except single quotes and left curly brackets. Thus, a string that should result in the formatted message "'{0}'" can be written as "'''{'0''"} or "'''{0'''"}.

Within a SubformatPattern, different rules apply. A QuotedPattern can contain arbitrary characters except single quotes, but the surrounding single quotes are not removed, so they may be interpreted by the subformat. For example, "{1,number,$'#',##"} will produce a number format with the hash-sign quoted, with a result such as: "$#31,45". An UnquotedPattern can contain arbitrary characters except single quotes, but curly braces within it must be balanced. For example, "ab {0 de"} and "ab '' de"} are valid subformat patterns, but "ab {0'' de"} and "ab de"} are not.

Warning:
The rules for using quotes within message format patterns unfortunately have shown to be somewhat confusing. In particular, it isn't always obvious to localizers whether single quotes need to be doubled or not. Make sure to inform localizers about the rules, and tell them (for example, by using comments in resource bundle source files) which strings will be processed by MessageFormat. Note that localizers may need to use single quotes in translated strings where the original version doesn't have them.
Note also that the simplest way to avoid the problem is to use the real apostrophe (single quote) character ’ (') for human-readable text, and to use the ASCII apostrophe (' ' ) only in program syntax, like quoting in MessageFormat. See the annotations for U+0027 Apostrophe in The Unicode Standard.

The ArgumentIndex value is a non-negative integer written using the digits '0' through '9', and represents an index into the arguments array passed to the format methods or the result array returned by the parse methods.

The FormatType and FormatStyle values are used to create a Format instance for the format element. The following table shows how the values map to Format instances. Combinations not shown in the table are illegal. A SubformatPattern must be a valid pattern string for the Format subclass used.

Format Type Format Style Subformat Created
(none) null
number (none) NumberFormat.getInstance(getLocale())
integer NumberFormat.getIntegerInstance(getLocale())
currency NumberFormat.getCurrencyInstance(getLocale())
percent NumberFormat.getPercentInstance(getLocale())
SubformatPattern new DecimalFormat(subformatPattern, new DecimalFormatSymbols(getLocale()))
date (none) DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())
short DateFormat.getDateInstance(DateFormat.SHORT, getLocale())
medium DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())
long DateFormat.getDateInstance(DateFormat.LONG, getLocale())
full DateFormat.getDateInstance(DateFormat.FULL, getLocale())
SubformatPattern new SimpleDateFormat(subformatPattern, getLocale())
time (none) DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())
short DateFormat.getTimeInstance(DateFormat.SHORT, getLocale())
medium DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())
long DateFormat.getTimeInstance(DateFormat.LONG, getLocale())
full DateFormat.getTimeInstance(DateFormat.FULL, getLocale())
SubformatPattern new SimpleDateFormat(subformatPattern, getLocale())
choice SubformatPattern new ChoiceFormat(subformatPattern)

Usage Information

Here are some examples of usage:

 Object[] arguments = {
         Integer.valueOf(7), new Date(System.currentTimeMillis()),
         "a disturbance in the Force"};
 String result = MessageFormat.format(
         "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
         arguments);
 
 Output:
 
 At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
 

Typically, the message format will come from resources, and the arguments will be dynamically set at runtime.

Example 2:

 Object[] testArgs = {Long.valueOf(3), "MyDisk"};
 MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s).");
 System.out.println(form.format(testArgs));
 
 Output with different testArgs:
 
 The disk "MyDisk" contains 0 file(s).
 The disk "MyDisk" contains 1 file(s).
 The disk "MyDisk" contains 1,273 file(s).
 

For more sophisticated patterns, you can use a ChoiceFormat to get output such as:

 MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
 double[] filelimits = {0,1,2};
 String[] filepart = {"no files","one file","{0,number} files"};
 ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
 form.setFormatByArgumentIndex(0, fileform);
 Object[] testArgs = {Long.valueOf(12373), "MyDisk"};
 System.out.println(form.format(testArgs));
 
 Output (with different testArgs):
 
 The disk "MyDisk" contains no files.
 The disk "MyDisk" contains one file.
 The disk "MyDisk" contains 1,273 files.
 
You can either do this programmatically, as in the above example, or by using a pattern (see ChoiceFormat for more information) as in:
 form.applyPattern("There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");
 

Note: As we see above, the string produced by a ChoiceFormat in MessageFormat is treated specially; occurances of '{' are used to indicated subformats, and cause recursion. If you create both a MessageFormat and ChoiceFormat programmatically (instead of using the string patterns), then be careful not to produce a format that recurses on itself, which will cause an infinite loop.

When a single argument is parsed more than once in the string, the last match will be the final result of the parsing. For example:

 MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}");
 Object[] objs = {new Double(3.1415)};
 String result = mf.format(objs);
 // result now equals "3.14, 3.1"
 objs = null;
 objs = mf.parse(result, new ParsePosition(0));
 // objs now equals {new Double(3.1)}
 

Likewise, parsing with a MessageFormat object using patterns containing multiple occurrences of the same argument would return the last match. For example:

 MessageFormat mf = new MessageFormat("{0}, {0}, {0}");
 String forParsing = "x, y, z";
 Object[] objs = mf.parse(forParsing, new ParsePosition(0));
 // result now equals {new String("z")}
 

Synchronization

Message formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

See also:

Summary

Nested classes

class MessageFormat.Field

The instances of this inner class are used as attribute keys in AttributedCharacterIterator that the formatToCharacterIterator(Object) method returns. 

Public constructors

MessageFormat(String template, Locale locale)

Constructs a new MessageFormat using the specified pattern and locale.

MessageFormat(String template)

Constructs a new MessageFormat using the specified pattern and the user's default locale.

Public methods

void applyPattern(String template)

Changes this MessageFormat to use the specified pattern.

Object clone()

Returns a new instance of MessageFormat with the same pattern and formats as this MessageFormat.

boolean equals(Object object)

Compares the specified object to this MessageFormat and indicates if they are equal.

final StringBuffer format(Object[] objects, StringBuffer buffer, FieldPosition field)

Converts the specified objects into a string which it appends to the specified string buffer using the pattern of this message format.

static String format(String format, Object... args)

Formats the supplied objects using the specified message format pattern.

final StringBuffer format(Object object, StringBuffer buffer, FieldPosition field)

Converts the specified objects into a string which it appends to the specified string buffer using the pattern of this message format.

AttributedCharacterIterator formatToCharacterIterator(Object object)

Formats the specified object using the rules of this message format and returns an AttributedCharacterIterator with the formatted message and attributes.

Format[] getFormats()

Returns the Format instances used by this message format.

Format[] getFormatsByArgumentIndex()

Returns the formats used for each argument index.

Locale getLocale()

Returns the locale used when creating formats.

int hashCode()

Returns an integer hash code for this object.

Object[] parse(String string)

Parses the message arguments from the specified string using the rules of this message format.

Object[] parse(String string, ParsePosition position)

Parses the message argument from the specified string starting at the index specified by position.

Object parseObject(String string, ParsePosition position)

Parses the message argument from the specified string starting at the index specified by position.

void setFormat(int offset, Format format)

Sets the specified format used by this message format.

void setFormatByArgumentIndex(int argIndex, Format format)

Sets the format used for the argument at index argIndex to format.

void setFormats(Format[] formats)

Sets the formats used by this message format.

void setFormatsByArgumentIndex(Format[] formats)

Sets the formats used for each argument.

void setLocale(Locale locale)

Sets the locale to use when creating Format instances.

String toPattern()

Returns the pattern of this message format.

Inherited methods

From class java.text.Format
From class java.lang.Object

Public constructors

MessageFormat

Added in API level 1
MessageFormat (String template, 
                Locale locale)

Constructs a new MessageFormat using the specified pattern and locale.

Parameters
template String: the pattern.
locale Locale: the locale.
Throws
IllegalArgumentException if the pattern cannot be parsed.

MessageFormat

Added in API level 1
MessageFormat (String template)

Constructs a new MessageFormat using the specified pattern and the user's default locale. See "Be wary of the default locale".

Parameters
template String: the pattern.
Throws
IllegalArgumentException if the pattern cannot be parsed.

Public methods

applyPattern

Added in API level 1
void applyPattern (String template)

Changes this MessageFormat to use the specified pattern.

Parameters
template String: the new pattern.
Throws
IllegalArgumentException if the pattern cannot be parsed.

clone

Added in API level 1
Object clone ()

Returns a new instance of MessageFormat with the same pattern and formats as this MessageFormat.

Returns
Object a shallow copy of this MessageFormat.

See also:

equals

Added in API level 1
boolean equals (Object object)

Compares the specified object to this MessageFormat and indicates if they are equal. In order to be equal, object must be an instance of MessageFormat and have the same pattern.

Parameters
object Object: the object to compare with this object.
Returns
boolean true if the specified object is equal to this MessageFormat; false otherwise.

See also:

format

Added in API level 1
StringBuffer format (Object[] objects, 
                StringBuffer buffer, 
                FieldPosition field)

Converts the specified objects into a string which it appends to the specified string buffer using the pattern of this message format.

If the field member of the specified FieldPosition is MessageFormat.Field.ARGUMENT, then the begin and end index of this field position is set to the location of the first occurrence of a message format argument. Otherwise, the FieldPosition is ignored.

Parameters
objects Object: the array of objects to format.
buffer StringBuffer: the target string buffer to append the formatted message to.
field FieldPosition: on input: an optional alignment field; on output: the offsets of the alignment field in the formatted text.
Returns
StringBuffer the string buffer.

format

Added in API level 1
String format (String format, 
                Object... args)

Formats the supplied objects using the specified message format pattern.

Parameters
format String: the format string (see format(String, Object...))
args Object: the list of arguments passed to the formatter. If there are more arguments than required by format, additional arguments are ignored.
Returns
String the formatted result.
Throws
IllegalArgumentException if the pattern cannot be parsed.

format

Added in API level 1
StringBuffer format (Object object, 
                StringBuffer buffer, 
                FieldPosition field)

Converts the specified objects into a string which it appends to the specified string buffer using the pattern of this message format.

If the field member of the specified FieldPosition is MessageFormat.Field.ARGUMENT, then the begin and end index of this field position is set to the location of the first occurrence of a message format argument. Otherwise, the FieldPosition is ignored.

Calling this method is equivalent to calling

 format((Object[])object, buffer, field)
 

Parameters
object Object: the object to format, must be an array of Object.
buffer StringBuffer: the target string buffer to append the formatted message to.
field FieldPosition: on input: an optional alignment field; on output: the offsets of the alignment field in the formatted text.
Returns
StringBuffer the string buffer.
Throws
ClassCastException if object is not an array of Object.

formatToCharacterIterator

Added in API level 1
AttributedCharacterIterator formatToCharacterIterator (Object object)

Formats the specified object using the rules of this message format and returns an AttributedCharacterIterator with the formatted message and attributes. The AttributedCharacterIterator returned also includes the attributes from the formats of this message format.

Parameters
object Object: the object to format.
Returns
AttributedCharacterIterator an AttributedCharacterIterator with the formatted message and attributes.
Throws
IllegalArgumentException if the arguments in the object array cannot be formatted by this message format.

getFormats

Added in API level 1
Format[] getFormats ()

Returns the Format instances used by this message format.

Returns
Format[] an array of Format instances.

getFormatsByArgumentIndex

Added in API level 1
Format[] getFormatsByArgumentIndex ()

Returns the formats used for each argument index. If an argument is placed more than once in the pattern string, then this returns the format of the last one.

Returns
Format[] an array of formats, ordered by argument index.

getLocale

Added in API level 1
Locale getLocale ()

Returns the locale used when creating formats.

Returns
Locale the locale used to create formats.

hashCode

Added in API level 1
int hashCode ()

Returns an integer hash code for this object. By contract, any two objects for which equals(Object) returns true must return the same hash code value. This means that subclasses of Object usually override both methods or neither method.

Note that hash values must not change over time unless information used in equals comparisons also changes.

See Writing a correct hashCode method if you intend implementing your own hashCode method.

Returns
int this object's hash code.

parse

Added in API level 1
Object[] parse (String string)

Parses the message arguments from the specified string using the rules of this message format.

Parameters
string String: the string to parse.
Returns
Object[] the array of Object arguments resulting from the parse.
Throws
ParseException if an error occurs during parsing.

parse

Added in API level 1
Object[] parse (String string, 
                ParsePosition position)

Parses the message argument from the specified string starting at the index specified by position. If the string is successfully parsed then the index of the ParsePosition is updated to the index following the parsed text. On error, the index is unchanged and the error index of ParsePosition is set to the index where the error occurred.

Parameters
string String: the string to parse.
position ParsePosition: input/output parameter, specifies the start index in string from where to start parsing. If parsing is successful, it is updated with the index following the parsed text; on error, the index is unchanged and the error index is set to the index where the error occurred.
Returns
Object[] the array of objects resulting from the parse, or null if there is an error.

parseObject

Added in API level 1
Object parseObject (String string, 
                ParsePosition position)

Parses the message argument from the specified string starting at the index specified by position. If the string is successfully parsed then the index of the ParsePosition is updated to the index following the parsed text. On error, the index is unchanged and the error index of ParsePosition is set to the index where the error occurred.

Parameters
string String: the string to parse.
position ParsePosition: input/output parameter, specifies the start index in string from where to start parsing. If parsing is successful, it is updated with the index following the parsed text; on error, the index is unchanged and the error index is set to the index where the error occurred.
Returns
Object the array of objects resulting from the parse, or null if there is an error.

setFormat

Added in API level 1
void setFormat (int offset, 
                Format format)

Sets the specified format used by this message format.

Parameters
offset int: the index of the format to change.
format Format: the Format that replaces the old format.

setFormatByArgumentIndex

Added in API level 1
void setFormatByArgumentIndex (int argIndex, 
                Format format)

Sets the format used for the argument at index argIndex to format.

Parameters
argIndex int: the index of the format to set.
format Format: the format that will be set at index argIndex.

setFormats

Added in API level 1
void setFormats (Format[] formats)

Sets the formats used by this message format.

Parameters
formats Format: an array of Format.

setFormatsByArgumentIndex

Added in API level 1
void setFormatsByArgumentIndex (Format[] formats)

Sets the formats used for each argument. The formats array elements should be in the order of the argument indices.

Parameters
formats Format: the formats in an array.

setLocale

Added in API level 1
void setLocale (Locale locale)

Sets the locale to use when creating Format instances. Changing the locale may change the behavior of applyPattern, toPattern, format and formatToCharacterIterator.

Parameters
locale Locale: the new locale.

toPattern

Added in API level 1
String toPattern ()

Returns the pattern of this message format.

Returns
String the pattern.
This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.