Answers:
MessageFormat.format("{0,number,#}", foo);
MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
在尝试通过国际化等方式创建“现实世界”模式时,我为此付出了一些努力。具体地说,我们需要使用“选择”格式,其中输出取决于所显示的值,这就是为什么java.text.ChoiceFormat
。
这是如何完成此操作的示例:
MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");
int[] nums = new int[] {
0,
1,
100,
1000,
10000,
100000,
1000000,
10000000
};
Object[] a = new Object[1];
for(int num : nums) {
a[0] = num;
System.out.println(fmt.format(a));
}
生成以下输出;我希望这对其他尝试完成相同类型事情的人有所帮助:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
如您所见,“选择”格式允许我们根据要传入的要格式化的值来选择要使用的格式类型。小数字可以用文本替换(不显示原始值)。显示的是中等大小的数字,没有分组分隔符(没有逗号)。数量最多的确包含逗号。显然,这是一个完全人为的示例,以演示的灵活性java.text.MessageFormat
。
关于#
格式文本中引用的注释:由于同时使用ChoiceFormat
和MessageFormat
,因此两者之间的元字符之间会发生冲突。ChoiceFormat
用途#
元字符,基本上的意思是“等于”,这样的格式化引擎知道,例如,在的情况下1#one!
,我们比较{0}
有1
,如果他们是平等的,它使用的是特定的“选择”。
但是#
对MessageFormat
,还有另一种含义,它是一个具有以下含义DecimalFormat
的元字符:这是一个元字符,其意思是“在此处输入数字”。
因为它是用ChoiceFormat
字符串包装的,所以#
需要用引号引起来。当ChoiceFormat
完成解析字符串,路过时,子格式到这些报价被删除MessageFormat
(然后到DecimalFormat
)。
因此,当您使用时{0,choice,...}
,必须引用那些#
字符,甚至可能还要引用其他字符。
最短的方法是
long foo = 12345;
String s = ""+foo;
new StringBuilder("").append(foo).toString()
真正并非最佳的状态。
""+
Long.toString()
它,因为无论如何这都是该解决方案在后台使用的方法:)
String.valueOf(long)