Class MessageFormat
- java.lang.Object
-
- java.text.Format
-
- java.text.MessageFormat
-
- All Implemented Interfaces:
Serializable,Cloneable
public class MessageFormat extends Format
Produces concatenated messages in language-neutral way. New code should probably useFormatterinstead.MessageFormattakes a set of objects, formats them and then inserts the formatted strings into the pattern at the appropriate places.Note:
MessageFormatdiffers from the otherFormatclasses in that you create aMessageFormatobject with one of its constructors (not with agetInstancestyle factory method). The factory methods aren't necessary becauseMessageFormatitself 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
MessageFormatuses 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 ' UnquotedPatternWithin 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"abde"} 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 inMessageFormat. 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
argumentsarray passed to theformatmethods or the result array returned by theparsemethods.The FormatType and FormatStyle values are used to create a
Formatinstance for the format element. The following table shows how the values map toFormatinstances. Combinations not shown in the table are illegal. A SubformatPattern must be a valid pattern string for theFormatsubclass used.Format Type Format Style Subformat Created (none) nullnumber(none) NumberFormat.getInstance(getLocale())integerNumberFormat.getIntegerInstance(getLocale())currencyNumberFormat.getCurrencyInstance(getLocale())percentNumberFormat.getPercentInstance(getLocale())SubformatPattern new DecimalFormat(subformatPattern, new DecimalFormatSymbols(getLocale()))date(none) DateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())shortDateFormat.getDateInstance(DateFormat.SHORT, getLocale())mediumDateFormat.getDateInstance(DateFormat.DEFAULT, getLocale())longDateFormat.getDateInstance(DateFormat.LONG, getLocale())fullDateFormat.getDateInstance(DateFormat.FULL, getLocale())SubformatPattern new SimpleDateFormat(subformatPattern, getLocale())time(none) DateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())shortDateFormat.getTimeInstance(DateFormat.SHORT, getLocale())mediumDateFormat.getTimeInstance(DateFormat.DEFAULT, getLocale())longDateFormat.getTimeInstance(DateFormat.LONG, getLocale())fullDateFormat.getTimeInstance(DateFormat.FULL, getLocale())SubformatPattern new SimpleDateFormat(subformatPattern, getLocale())choiceSubformatPattern 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
ChoiceFormatto get output such as:
You can either do this programmatically, as in the above example, or by using a pattern (seeMessageFormat 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.ChoiceFormatfor 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
ChoiceFormatinMessageFormatis treated specially; occurances of '{' are used to indicated subformats, and cause recursion. If you create both aMessageFormatandChoiceFormatprogrammatically (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
MessageFormatobject 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:
Formatter, Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static classMessageFormat.FieldThe instances of this inner class are used as attribute keys inAttributedCharacterIteratorthat theformatToCharacterIterator(Object)method returns.
-
Constructor Summary
Constructors Constructor Description MessageFormat(String template)Constructs a newMessageFormatusing the specified pattern and the user's default locale.MessageFormat(String template, Locale locale)Constructs a newMessageFormatusing the specified pattern andlocale.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidapplyPattern(String template)Changes thisMessageFormatto use the specified pattern.Objectclone()Returns a new instance ofMessageFormatwith the same pattern and formats as thisMessageFormat.booleanequals(Object object)Compares the specified object to thisMessageFormatand indicates if they are equal.StringBufferformat(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.StringBufferformat(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.static Stringformat(String format, Object... args)Formats the supplied objects using the specified message format pattern.AttributedCharacterIteratorformatToCharacterIterator(Object object)Formats the specified object using the rules of this message format and returns anAttributedCharacterIteratorwith the formatted message and attributes.Format[]getFormats()Returns theFormatinstances used by this message format.Format[]getFormatsByArgumentIndex()Returns the formats used for each argument index.LocalegetLocale()Returns the locale used when creating formats.inthashCode()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 byposition.ObjectparseObject(String string, ParsePosition position)Parses the message argument from the specified string starting at the index specified byposition.voidsetFormat(int offset, Format format)Sets the specified format used by this message format.voidsetFormatByArgumentIndex(int argIndex, Format format)Sets the format used for the argument at indexargIndextoformat.voidsetFormats(Format[] formats)Sets the formats used by this message format.voidsetFormatsByArgumentIndex(Format[] formats)Sets the formats used for each argument.voidsetLocale(Locale locale)Sets the locale to use when creatingFormatinstances.StringtoPattern()Returns the pattern of this message format.-
Methods inherited from class java.text.Format
format, parseObject
-
-
-
-
Constructor Detail
-
MessageFormat
public MessageFormat(String template, Locale locale)
Constructs a newMessageFormatusing the specified pattern andlocale.- Parameters:
template- the pattern.locale- the locale.- Throws:
IllegalArgumentException- if the pattern cannot be parsed.
-
MessageFormat
public MessageFormat(String template)
Constructs a newMessageFormatusing the specified pattern and the user's default locale. See "Be wary of the default locale".- Parameters:
template- the pattern.- Throws:
IllegalArgumentException- if the pattern cannot be parsed.
-
-
Method Detail
-
applyPattern
public void applyPattern(String template)
Changes thisMessageFormatto use the specified pattern.- Parameters:
template- the new pattern.- Throws:
IllegalArgumentException- if the pattern cannot be parsed.
-
clone
public Object clone()
Returns a new instance ofMessageFormatwith the same pattern and formats as thisMessageFormat.
-
equals
public boolean equals(Object object)
Compares the specified object to thisMessageFormatand indicates if they are equal. In order to be equal,objectmust be an instance ofMessageFormatand have the same pattern.- Overrides:
equalsin classObject- Parameters:
object- the object to compare with this object.- Returns:
trueif the specified object is equal to thisMessageFormat;falseotherwise.- See Also:
hashCode()
-
formatToCharacterIterator
public AttributedCharacterIterator formatToCharacterIterator(Object object)
Formats the specified object using the rules of this message format and returns anAttributedCharacterIteratorwith the formatted message and attributes. TheAttributedCharacterIteratorreturned also includes the attributes from the formats of this message format.- Overrides:
formatToCharacterIteratorin classFormat- Parameters:
object- the object to format.- Returns:
- an
AttributedCharacterIteratorwith the formatted message and attributes. - Throws:
IllegalArgumentException- if the arguments in the object array cannot be formatted by this message format.
-
format
public 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.If the
fieldmember of the specifiedFieldPositionisMessageFormat.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, theFieldPositionis ignored.- Parameters:
objects- the array of objects to format.buffer- the target string buffer to append the formatted message to.field- on input: an optional alignment field; on output: the offsets of the alignment field in the formatted text.- Returns:
- the string buffer.
-
format
public 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.If the
fieldmember of the specifiedFieldPositionisMessageFormat.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, theFieldPositionis ignored.Calling this method is equivalent to calling
format((Object[])object, buffer, field)
- Specified by:
formatin classFormat- Parameters:
object- the object to format, must be an array ofObject.buffer- the target string buffer to append the formatted message to.field- on input: an optional alignment field; on output: the offsets of the alignment field in the formatted text.- Returns:
- the string buffer.
- Throws:
ClassCastException- ifobjectis not an array ofObject.
-
format
public static String format(String format, Object... args)
Formats the supplied objects using the specified message format pattern.- Parameters:
format- the format string (seeFormatter.format(java.lang.String, java.lang.Object...))args- the list of arguments passed to the formatter. If there are more arguments than required byformat, additional arguments are ignored.- Returns:
- the formatted result.
- Throws:
IllegalArgumentException- if the pattern cannot be parsed.
-
getFormats
public Format[] getFormats()
Returns theFormatinstances used by this message format.- Returns:
- an array of
Formatinstances.
-
getFormatsByArgumentIndex
public 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:
- an array of formats, ordered by argument index.
-
setFormatByArgumentIndex
public void setFormatByArgumentIndex(int argIndex, Format format)Sets the format used for the argument at indexargIndextoformat.- Parameters:
argIndex- the index of the format to set.format- the format that will be set at indexargIndex.
-
setFormatsByArgumentIndex
public void setFormatsByArgumentIndex(Format[] formats)
Sets the formats used for each argument. Theformatsarray elements should be in the order of the argument indices.- Parameters:
formats- the formats in an array.
-
getLocale
public Locale getLocale()
Returns the locale used when creating formats.- Returns:
- the locale used to create formats.
-
hashCode
public int hashCode()
Description copied from class:ObjectReturns an integer hash code for this object. By contract, any two objects for whichObject.equals(java.lang.Object)returnstruemust return the same hash code value. This means that subclasses ofObjectusually 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
hashCodemethod if you intend implementing your ownhashCodemethod.- Overrides:
hashCodein classObject- Returns:
- this object's hash code.
- See Also:
Object.equals(java.lang.Object)
-
parse
public Object[] parse(String string) throws ParseException
Parses the message arguments from the specified string using the rules of this message format.- Parameters:
string- the string to parse.- Returns:
- the array of
Objectarguments resulting from the parse. - Throws:
ParseException- if an error occurs during parsing.
-
parse
public Object[] parse(String string, ParsePosition position)
Parses the message argument from the specified string starting at the index specified byposition. If the string is successfully parsed then the index of theParsePositionis updated to the index following the parsed text. On error, the index is unchanged and the error index ofParsePositionis set to the index where the error occurred.- Parameters:
string- the string to parse.position- input/output parameter, specifies the start index instringfrom 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:
- the array of objects resulting from the parse, or
nullif there is an error.
-
parseObject
public Object parseObject(String string, ParsePosition position)
Parses the message argument from the specified string starting at the index specified byposition. If the string is successfully parsed then the index of theParsePositionis updated to the index following the parsed text. On error, the index is unchanged and the error index ofParsePositionis set to the index where the error occurred.- Specified by:
parseObjectin classFormat- Parameters:
string- the string to parse.position- input/output parameter, specifies the start index instringfrom 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:
- the array of objects resulting from the parse, or
nullif there is an error.
-
setFormat
public void setFormat(int offset, Format format)Sets the specified format used by this message format.- Parameters:
offset- the index of the format to change.format- theFormatthat replaces the old format.
-
setFormats
public void setFormats(Format[] formats)
Sets the formats used by this message format.- Parameters:
formats- an array ofFormat.
-
setLocale
public void setLocale(Locale locale)
Sets the locale to use when creatingFormatinstances. Changing the locale may change the behavior ofapplyPattern,toPattern,formatandformatToCharacterIterator.- Parameters:
locale- the new locale.
-
toPattern
public String toPattern()
Returns the pattern of this message format.- Returns:
- the pattern.
-
-