一、概述
在国际化应用中,日期格式化、数字格式化和消息格式化是常见的需求,针对这些需求,Java提供了一系列的类和工具:DateFormat、NumberFormat、MessageFormat和ResourceBundle。
二、DateFormat使用
DateFormat是一个日期格式化类,它可以将Date对象格式化成指定的字符串。
使用方法如下:
Date date = new Date();
Locale locale = new Locale("zh", "CN");//指定语言和地区
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);//指定日期格式和语言环境
String dateStr = dateFormat.format(date);
System.out.println(dateStr);
运行结果如下:
2022年4月28日星期四上午12时00分00秒 CST
其中getDateTimeInstance()方法的第一个参数表示日期格式,FULL表示完整格式,MEDIUM表示中等格式,SHORT表示简略格式;第二个参数表示时间格式;第三个参数表示指定的语言环境。
三、NumberFormat使用
NumberFormat是一个数字格式化类,它可以将数字格式化成指定的字符串。
使用方法如下:
double num = 1234567.89;
Locale locale = new Locale("zh", "CN");//指定语言和地区
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);//指定数字格式和语言环境
String numStr = numberFormat.format(num);
System.out.println(numStr);
运行结果如下:
1,234,567.89
其中getNumberInstance()方法返回一个数字格式化对象,该对象中包含了对数字的格式化方式以及指定的语言环境。
四、MessageFormat使用
MessageFormat是一个消息格式化类,它可以将包含参数的消息格式化成指定的字符串。
使用方法如下:
Locale locale = new Locale("zh", "CN");//指定语言和地区
String pattern = "你好,{0},您的订单{1}已经提交。";//定义消息模板
MessageFormat messageFormat = new MessageFormat(pattern);//指定消息模板
String result = messageFormat.format(new Object[]{"张三", "123456"});//指定参数
System.out.println(result);
运行结果如下:
你好,张三,您的订单123456已经提交。
其中MessageFormat的构造函数中需要指定一个消息模板,该模板中可以使用占位符,然后使用format()方法指定对应的参数来进行格式化。
五、ResourceBundle使用
ResourceBundle是一个资源包管理类,它可以加载各种格式的资源,如.properties文件、.xml文件等,并实现了国际化。
使用方法如下:
Locale locale = new Locale("zh", "CN");//指定语言和地区
ResourceBundle resourceBundle = ResourceBundle.getBundle("message", locale);//指定资源包名和语言环境
String name = resourceBundle.getString("name");//从资源包中取出对应的值
String tel = resourceBundle.getString("tel");
String address = resourceBundle.getString("address");
System.out.println(name + "-" + tel + "-" + address);
其中message是一个.properties文件,该文件中包含了对应的键值对,如下所示:
name=张三
tel=13812345678
address=北京市朝阳区
运行结果如下:
张三-13812345678-北京市朝阳区
ResourceBundle的getBundle()方法中需要指定资源包的名字和语言环境。
另外,如果资源文件的名字转换与默认转换方式不同,就需要指定资源文件的转换方式,如:
ResourceBundle resourceBundle = ResourceBundle.getBundle("com.mycompany.myapp.messages",
new Locale("fr", "CA"), new ResourceBundle.Control() {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
String resourceName = toBundleName(baseName, locale) + ".properties";
InputStream is = loader.getResourceAsStream(resourceName);
if (is != null) {
try (InputStreamReader isr = new InputStreamReader(is, "UTF-8")) {
return new PropertyResourceBundle(isr);
}
}
return super.newBundle(baseName, locale, format, loader, reload);
}
});
该代码中使用了新建了一个ResourceBundle.Control,它重载了newBundle()方法,在加载资源的时候使用了指定的转换方式。
六、示例说明
下面是一个完整的示例,它展示了DateFormat、NumberFormat、MessageFormat和ResourceBundle的使用方法,并实现了国际化。该示例会根据设置的语言自动加载不同的资源文件,每个资源文件都包含了对应语言的消息和格式化方式。代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
public class InternationalizationDemo {
public static void main(String[] args) {
Locale locale = Locale.getDefault();//获取默认的语言
ResourceBundle resourceBundle = ResourceBundle.getBundle("message", locale);//获取对应的资源包
String name = resourceBundle.getString("name");//从资源包中获取值
String tel = resourceBundle.getString("tel");
String address = resourceBundle.getString("address");
System.out.println(name + "-" + tel + "-" + address);
double num = 1234567.89;
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);//使用默认的或指定的语言环境创建NumberFormat对象
String numStr = numberFormat.format(num);
System.out.println(numStr);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);//指定日期格式和语言环境
String dateStr = dateFormat.format(date);
System.out.println(dateStr);
String pattern = resourceBundle.getString("message");//从资源包中获取消息模板
MessageFormat messageFormat = new MessageFormat(pattern);//指定消息模板
String result = messageFormat.format(new Object[]{name, "123456"});//格式化消息
System.out.println(result);
}
}
同时该示例还包含了以下资源文件:
message.properties
name=张三
tel=13812345678
address=北京市朝阳区
message=你好,{0},您的订单{1}已经提交。
message_en.properties
name=John
tel=13855555555
address=Beijing, China
message=Hello, {0}, your order {1} has been submitted.
message_fr.properties
name=Jean
tel=13866666666
address=Beijing, Chine
message=Bonjour, {0}, votre commande {1} a été soumise.
当运行该程序时,会自动加载对应的资源文件,输出结果如下:
张三-13812345678-北京市朝阳区
1,234,567.89
2022年4月28日星期四上午12时00分00秒 CST
你好,张三,您的订单123456已经提交。
当将程序的语言设置为English(通过设置环境变量),再次运行程序,会自动加载message_en.properties,输出结果如下:
John-13855555555-Beijing, China
1,234,567.89
Thursday, April 28, 2022 12:00:00 AM CST
Hello, John, your order 123456 has been submitted.
当将程序的语言设置为French(通过设置环境变量),再次运行程序,会自动加载message_fr.properties,输出结果如下:
Jean-13866666666-Beijing, Chine
1 234 567,89
jeudi 28 avril 2022 00 h 00 CST
Bonjour, Jean, votre commande 123456 a été soumise.
可以看到,根据设置的语言不同,程序输出的结果也不同,实现了国际化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用 - Python技术站