java.text.MessageFormat

java.text.MessageFormat

MessageFormat provides a means to produce concatenated messages
in a language-neutral way. Use this to construct messages displayed for end
users.

MessageFormat takes a set of objects, formats them, 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:
         StringPartopt
         String StringPart

 StringPart:
         ‘‘
         ‘ QuotedStringUnquotedString

 SubformatPattern:
         SubformatPatternPartopt
         SubformatPattern SubformatPatternPart

 SubFormatPatternPart:QuotedPatternUnquotedPattern
 

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

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) (none) null
number (none) NumberFormat.getInstance(getLocale())
integer NumberFormat.getIntegerInstance(getLocale())
currency NumberFormat.getCurrencyInstance(getLocale())
percent NumberFormat.getPercentInstance(getLocale())
SubformatPattern new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(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. In real internationalized programs, the message format pattern and other static strings will, of course, be obtained from resource bundles. Other parameters will be dynamically determined at runtime.

The first example uses the static method MessageFormat.format, which internally creates a MessageFormat for one-time use:

 int planet = 7;
 String event = "a disturbance in the Force";

 String result = MessageFormat.format(
     "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
     planet, new Date(), event);
 

The output is:

 At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
 

The following example creates a MessageFormat instance that can be used repeatedly:

 int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 MessageFormat form = new MessageFormat(
     "The disk \"{1}\" contains {0} file(s).");

 System.out.println(form.format(testArgs));
 

The output with different values for fileCount:

 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 produce correct forms for singular and plural:

 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);

 int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 System.out.println(form.format(testArgs));
 

The output with different values for fileCount:

 The disk "MyDisk" contains no files.
 The disk "MyDisk" contains one file.
 The disk "MyDisk" contains 1,273 files.
 

You can create the ChoiceFormat programmatically, as in the above example, or by using a pattern. See ChoiceFormat for more information.

 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 as special; occurrences of ‘{‘ are used to indicate 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.

Version:
%I%, %G%
Author:
Mark Davis
See Also:
java.util.Locale
Format
NumberFormat
DecimalFormat
ChoiceFormat

java.text.MessageFormat

时间: 2024-10-07 01:31:10

java.text.MessageFormat的相关文章

java.text.MessageFormat格式化字符串时的小技巧

public static void main(String[] args) throws InterruptedException { MessageFormat form = new MessageFormat( "{2,date,yyyy-MM-dd HH:mm:ss.SSS} The disk \"{1}\" contains {0,number,#.##} file(s).{3}"); int fileCount = 1273273237; String

关于java中MessageFormat.format中单引号问题

我们知道java中可以用MessageFormat.format来格式化字符串.这个方法在我们的实际开发中经常用到,有点类似模板,这样我们就不需要用很恶心的拼接字符串了.如下面 String s1="my blogWebSite is {0} and sinaWeiBo is {1} "; String s2=MessageFormat.format(s1,"http://www.3lai8.com","http://weibo.com/javaee6&q

java.text.Format及相关类详解

java.text.Format Format是一个用于格式化语言环境敏感的信息(如日期.消息和数字)的抽象基类,直接已知子类有DateFormat, MessageFormat, NumberFormat. Format定义了编程接口,用于将语言环境敏感的对象格式化为String(使用format方法)和将String重新解析为对象(使用 parseObject方法). 通常,一个Format的parseObject方法必须能解析任何由其Format方法格式化的字符串.不过,也可能存在不能解析

由Double类型数据到数据的格式化包java.text

需求:Double类型数据截取操作保留两位小数 解决方案: 1 java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); 2 df.format(你要格式化的数字); 也可写成一句: 1 new java.text.DecimalFormat("#.00").format(你要格式化的数字); 引申:java.text包:提供以与自然语言无关的方式来处理文本.日期.数字和消息的类和接口. jav

java.text.Format体系总结

1.1. Format的方法 java.text.Format做为一个抽象类,有二个抽象方法, format(Object obj, StringBuffer toAppendTo, FieldPosition pos):格式化一个对象,并将得到的文本追加到给定的字符缓冲区.是将obj格式化为字符串,并加入到toAppendTo中. parseObject(String source, ParsePosition pos): 分析字符串文本,生成一个对象.是format方法的逆向方法,将Stri

【java】Date与String之间的转换:java.text.SimpleDateFormat、public Date parse(String source) throws ParseException和public final String format(Date date)

1 package 日期日历类; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 public class TestDate { 8 public static void main(String[] args) { 9 Date date=new java.util.Date(); 10 System.out.println(date);/

java.text.NumberFormat

NumberFormat 是所有数值格式的抽象基类.此类提供格式化和解析数值的接口.NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么. NumberFormat 可用于格式化和解析任何语言环境的数值.使代码能够完全独立于小数点.千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关. 若要格式化当前 Locale 的数值,可使用其中一个工厂类方法: myString = NumberFormat.getInstance().for

java.text.NumberFormat使用方法

NumberFormat 是全部数值格式的抽象基类. 该类提供了格式化和分析数值的接口. NumberFormat 也提供了确定 哪个语言环境具有数值格式以及它们名字的方法. package com.discursive.jccook.collections; import java.text.NumberFormat; public class Test { /** * @param args */ public static void main(String[] args) { // TOD

java.text.ParseException: Unparseable date: &quot;Mon Mar 30 00:00:00 CST 2015&quot;

解决方案: package config; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) { String s="Mon Mar 30 00:00:00 CST 2015"; D