消息格式化
java类库中有个MessageFormat类,用来格式化带变量的文本
1 | String msg=MessageFormat.format("On {2},a {0} destroyed {1} houses and caused {3} of damage." |
在上面这个例子中,占位符{0}被“hurricane”替换,{1}被99替换,等等
除此之外,上面这个例子还可以进一步被完善
1 | "On {2,date,long},a {0} destroyed {1} houses and caused {3,number,currency} of damage." |
占位符后面跟的是type和style,它们之间用逗号隔开。类型有以下
1 | number |
如类型是number,style可以是
1 | integer |
若类型是time或date
1 | short |
附:
静态的MessageFormat.format方法只能使用默认的locale对值进行格式化,如果想用任意的locale进行格式化,可以这样做
1 | MessageFormat mf=new MessageFormat(pattern,loc); |
消息格式化之选择格式
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 | no houses |
choice 的格式化选项就是为了这个目的而设计的。
- 一个选择格式是由一个序列对构成的, 每一对都包括 : 一个下限 + 一个格式字符串;
- 下限和格式字符串由一个 # 符号分割, 对与对之间由 符号 | 分割;
如:{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”; |