博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MessageFormat初步

Posted on 2006-11-29 13:51  daniel-shen  阅读(1097)  评论(0编辑  收藏  举报
public class MessageFormat
extends Format

MessageFormat 提供了一种用中性语言方式产生连接信息的方法。 用该类构造显示给最终用户的信息。

MessageFormat 产生一系列对象,格式化它们,然后把格式化的字符串插入模式中恰当的地方。

注意: MessageFormat 与其它 Format 类不同,用对象的构造子创建一个 MessageFormat 对象 ( 而不是用一个 getInstance 风格的工厂方法 )。 不需要这些工厂方法,因为 MessageFormat 不要求为给定的语言环境进行复杂的设置。 实际上,MessageFormat 根本没有实现任何语言环境特定的行为。 它只需要以句子为基础在句子上建立。

下面是一些用法示例:

 Object[] arguments = {
new Integer(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);
: At 12:30 PM on Jul 3, 2053, there was a disturbance
in the Force on planet 7.
通常,消息的格式来自于资源,且参数将在运行期间动态的设置。

示例 2:

 Object[] testArgs = {new Long(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).

模式的形式是:

 messageFormatPattern := string ( "{" messageFormatElement "}" string )*
messageFormatElement := argument { "," elementFormat }
elementFormat := "time" { "," datetimeStyle }
| "date" { "," datetimeStyle }
| "number" { "," numberStyle }
| "choice" { "," choiceStyle }
datetimeStyle := "short"
| "medium"
| "long"
| "full"
| dateFormatPattern
numberStyle := "currency"
| "percent"
| "integer"
| numberFormatPattern
choiceStyle := choiceFormatPattern
如果没有 elementFormat,那么参数必须用一个字符串代替。 如果没有 dateTimeStylenumberStyle,就使用缺省格式 ( 例如,NumberFormat.getInstanceDateFormat.getTimeInstanceDateFormat.getInstance)。

必要的话,在字符串中的单引号可用来引起 "{"( 花括号 )。 一个真正的单引号用 '' 表示。 在 messageFormatElement 中,引号被删除。 例如,{1,number,$'#',##} 将产生一个含有被引起的磅符号的数字格式,结果是诸如 "$#31,45" 的形式。

如果使用了一个模式,模式中如果有未括起的花括号,它们必须匹配:即 "ab {0} de" 和 "ab '}' de" 是合法的,但是 "ab {0'}' de" and "ab } de" 是非法的。

参数是 0 到 9 之间的数字,它相应与格式化的数组中的参数。

数组中可以含有未用的参数。 但如果缺少参数或参数不是特定格式要求的正确的类的对象,将抛出一个 ParseException。 首先, format 检验是否用 setFormats 方法为参数指定了一个 Format 对象。 如果指定了,那么 format 使用这个 Format 对象格式化该参数。 否则根据对象的类型格式化参数。 如果参数是一个 Number,那么 formatNumberFormat.getInstance 格式化该参数;如果参数是一个 Date,那么 formatDateFormat.getDateTimeInstance 格式化该参数。 否则它使用 toString 方法。

对于更复杂的模式,可用 ChoiceFormat 输出,如:

 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.setFormat(1,fileform); // NOT zero, see below
Object[] testArgs = {new Long(12373), "MyDisk"};
System.out.println(form.format(testArgs));
// output, with different testArgs
output: The disk "MyDisk" contains no files.
output: The disk "MyDisk" contains one file.
output: The disk "MyDisk" contains 1,273 files.
可以象上面示例中那样用程序完成格式化,也可以用一个模式 ( 有关的更多信息请参阅 ChoiceFormat) ,如:
 form.applyPattern(
"There {0,choice,0#are no files|1#is one file|1#are {0,number,integer} files}.");

注意: 就象上面看到的那样,由 MessageFormat 中的 ChoiceFormat 产生的字符串将被特别对待;'{' 用于指示子格式并将产生递归。 如果用程序创建了 MessageFormatChoiceFormat ( 而不是用字符串模式 ),那么注意不要产生一个在自身上递归的格式,这将引起无限循环。

注意: 格式按照字符串中变量的顺序编号。这与参数编号不同。 例如:"abc{2}def{3}ghi{0}...",

  • format0 影响第一个变量 {2}
  • format1 影响第二个变量 {3}
  • format2 影响第二个变量 {0}
  • 依次类推。

可以在 applyPattern 之后使用 setLocale ( 可能再调用 setFormat) 以不同的语言环境重新初始化 MessageFormat