消息格式化

消息格式化

java类库中有个MessageFormat类,用来格式化带变量的文本

1
2
3
4
String msg=MessageFormat.format("On {2},a {0} destroyed {1} houses and caused {3} of damage."
,"hurricane",99,
new GregorianCalendar(1999,0,1).getTime(),
10.0E8);

在上面这个例子中,占位符{0}被“hurricane”替换,{1}被99替换,等等

除此之外,上面这个例子还可以进一步被完善

1
2
3
"On {2,date,long},a {0} destroyed {1} houses and caused {3,number,currency} of damage."
//可以被转换成
"On January 1,1999,a hurricane destroyed 99 houses and caused $100,000,000 of damage."

占位符后面跟的是type和style,它们之间用逗号隔开。类型有以下

1
2
3
4
number
time
date
choice

如类型是number,style可以是

1
2
3
integer
currency
percent

若类型是time或date

1
2
3
4
short
medium
long
full

附:

静态的MessageFormat.format方法只能使用默认的locale对值进行格式化,如果想用任意的locale进行格式化,可以这样做

1
2
3
MessageFormat mf=new MessageFormat(pattern,loc);
String msg=mf.format(new Object[] {....});
//Object[]中是即将被格式化的值

消息格式化之选择格式

problem: “on {2}, a {0} destoryed {1} houses and caused {3} of damage. “, 如果用“earthquake” 来替换代表灾难的占位符{0}, 那么在英语中,这句话就不正确了,因为,
on january 1, 1999, a earthquack destoryed, 因为 earthquake 的首字母是 e, 冠词是an 而不是 a;
solution:我们希望消息能随占位符发生变化, 这样就能根据具体的值形成

1
2
3
no houses 
one house
2 houses

choice 的格式化选项就是为了这个目的而设计的。

  1. 一个选择格式是由一个序列对构成的, 每一对都包括 : 一个下限 + 一个格式字符串;
  2. 下限和格式字符串由一个 # 符号分割, 对与对之间由 符号 | 分割;
    如:{1, choice,0#no houses | 1#one house|2#{1} houses}
    0#no houses : 0 是 下限, # 是分割符, no houses 是格式化字符串;(注意 0, 1, 是下限,最低限度)

可以使用 < 符号来表示如果替换值严格小于下限,则选中这个选择项;也可以使用 ≤ (unicode中代码是 u\2264)来实现 和 # 相同 的效果。如果愿意的话,甚至可以将第一个下限值定义为 -∞(unicode 编码是 -\u221E)

1
-∞ < no houses |0 < one house |2≤{1} houses; 或者使用 Unicode 转移字符: -\u221E < no houses | 0 < one house |2\u2264 {1} houses;

看个栗子

1
String pattern = “on {2, date, long}, {0} destoryed {1, choice, 0#no houses|1#one house|2#{1} houses}” + “and caused {3, number, currency} of damage”;
Donate comment here