我试图更多地了解 Java 的MessageFormat实用程序,在我们的代码库和其他地方的示例中,我看到了两者{0}
并被{0,number,integer}
用于数字,但我不确定哪一个更可取。
快速测试打印差异:
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class MessageFormatTest
{
public static void main(String[] args){
MessageFormat simpleChoiceTest = new MessageFormat("{0}");
MessageFormat explicitChoiceTest = new MessageFormat("{0,number,integer}");
int[] set = new int[]{0,1,4,5,6,10,10000,24345};
Locale[] locs = new Locale[]{Locale.US,Locale.UK,Locale.FRANCE,Locale.GERMANY};
for(Locale loc : locs){
simpleChoiceTest.setLocale(loc);
explicitChoiceTest.setLocale(loc);
for(int i : set){
String simple = simpleChoiceTest.format(new Object[]{i});
String explicit = explicitChoiceTest.format(new Object[]{i});
if(!simple.equals(explicit)){
System.out.println(loc+" - "+i+":\t"+simple+
"\t"+NumberFormat.getInstance(loc).format(i));
System.out.println(loc+" - "+i+":\t"+explicit+
"\t"+NumberFormat.getIntegerInstance(loc).format(i));
}
}
}
}
}
输出:
fr_FR - 10000: 10 000 10 000
fr_FR - 10000: 10,000 10 000
fr_FR - 24345: 24 345 24 345
fr_FR - 24345: 24,345 24 345
de_DE - 10000: 10.000 10.000
de_DE - 10000: 10,000 10.000
de_DE - 24345: 24.345 24.345
de_DE - 24345: 24,345 24.345
这让我感到惊讶,如果有什么我会预料{0}
到不会对这个数字做任何事情,{0,number,integer}
而是为了正确地对其进行本地化。相反,两者都被本地化,但似乎显式形式总是使用 en_US 本地化。
根据链接的文档,{0}
当NumberFormat.getInstance(getLocale())
显式表单使用NumberFormat.getIntegerInstance(getLocale())
. 然而,当我直接调用它们(输出中的最后一列)时,它们看起来都相同,并且都正确定位。
我在这里想念什么?