8.2.16 格式化带占位符的国际化资源信息

优质
小牛编辑
132浏览
2023-12-01

本实例通过设置不同的占位符格式来测试MessageFormat对象对这些带占位符的国际化资源信息的格式化效果。在本例中测试了对字符串、数字、百分数以及日期类型的格式化。

例子 : 格式化带占位符的国际化资源信息

1. 向资源文件中添加资源信息

在MyResource_zh.properties文件中添加如下的信息:

pattern = 你好,{0}, 现在的时间是{1, time, long}.

上面的模式字符串有两个占位符,其中“{0}”只是一个普通的占位符,而“{1, time, long}”则限定格式化对象必须是日期类型,而且系统会按着本地环境的long模式显示日期。

2. 编写FormatResource类

FormatResource类负责格式化不同的模式字符串,并输出格式化结果。该类的代码如下:

package chapter8;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Date;
public class FormatResource
{
    public static void main(String[] args)
    {
        String pattern1 = "我们公司{0, number,percent}的员工是研究生.";
        String pattern2 = "I am {0, number} years old. Today is {1, date, long}";
        String pattern3 = "现在是{0, date, yyyy-MM-dd HH:mm:ss}";
        String pattern4 = "{0, number,0.00},{0, number,0.0#}, {1, number,0.00},
                               {1, number,0.0#}";
        String pattern5 = "{0, number,000.00}, {0, number,#00.00}, {1, number,#00.00},
                             {1, number,000.00}";
        String pattern6 = "{0, number,#,#00.00}, {1, number,#,#00.00}";
        // 根据pattern1创建MessageFormat对象
        java.text.MessageFormat mf1 = new java.text.MessageFormat(pattern1);
        // 格式化模式字符串,输出数字的百分数形式
        System.out.println(mf1.format(new Object[]{ 0.3 }));
        // 根据pattern2创建MessageFormat对象
        java.text.MessageFormat mf2 = new java.text.MessageFormat("");
        mf2.setLocale(Locale.US);
        mf2.applyPattern(pattern2);
        // 格式化模式字符串,输出数字和long模式的日期(本地环境是美国英语)
        System.out.println(mf2.format(new Object[]
        { 20, new Date() }));
        mf2.setLocale(Locale.CHINESE);
        mf2.applyPattern(pattern2);
        // 格式化模式字符串,输出数字和long模式的日期(本地环境是中文)
        System.out.println(mf2.format(new Object[]
        { 20, new Date() }));
        System.out.println(mf2.format(pattern3, new Date()));
        System.out.println(mf2.format(pattern4, 5.4, 5.123));
        System.out.println(mf2.format(pattern5, 12.1, 1234562));
        System.out.println(mf2.format(pattern6, 123456,3, 1.2));
        // 加载资源文件
        ResourceBundle rb = ResourceBundle.getBundle("resources.MyResource",
                Locale.CHINESE);
        String pattern = rb.getString("pattern");
        mf2.setLocale(Locale.US);
        // 格式化模式字符串,输出long模式的日期(本地环境是中文)
        System.out.println(mf2.format(pattern, "bill", new Date()));
    }
}

3. 测试FormatResource程序

运行FormatResource程序后,将输出如下的信息:

我们公司30%的员工是研究生.

I am 20 years old. Today is October 17, 2008

I am 20 years old. Today is 2008年10月17日

现在是 2008-10-17 17:52:29

5.40,5.4, 5.12, 5.12

012.10, 12.10, 1234562.00, 1234562.00

123,456.00, 03.00

你好,bill, 现在的时间是下午05时52分29秒.

从上面的输出结果可以看出,如果将本地环境设为“美国英语”,则会输出美国英语习惯的long模式的日期,如果将本地环境设为“中文”,则会输出中文习惯的long模式的日期。

4. 程序总结

如果在模式字符串占位符中的模式字符串部分的前后包含空格,也将作为占位符中的模式字符串的一部分。如模式字符串“2008 + 20.23 = {0, number,    0.00}”中的占位符的模式字符串前面有4个空格。在格式化数字时,这4个空格仍然会保留。如格式化“2028.23”,则该模式字符串的最终输出结果如下:

2008 + 20.23 =     2028.23