javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

一、概述
在国际化应用中,日期格式化、数字格式化和消息格式化是常见的需求,针对这些需求,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技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • SpringBoot+SpringSecurity+JWT实现系统认证与授权示例

    下面是“SpringBoot+SpringSecurity+JWT实现系统认证与授权”的完整攻略: 一、什么是Spring Boot、Spring Security和JWT Spring Boot:是一个快速开发框架,能够简化Spring应用程序的创建和开发过程。 Spring Security:是Spring框架中提供的一套安全服务框架,可以用来保护Web…

    Java 2023年5月20日
    00
  • java读取cvs文件并导入数据库

    敬爱的读者,首先感谢您对 Java 编程的热爱。关于如何从CSV文件中读取数据并将其导入数据库,本文将提供一个完整的攻略,详细介绍每个步骤。在本文中,我们将使用Java编写代码来实现该功能。 1. 准备CSV文件 首先,需要准备好包含数据的 CSV 文件。CSV 文件是一种纯文本格式,用于存储和交换以逗号、制表符、分号等分隔符隔开的数据。你可以使用 Micr…

    Java 2023年5月20日
    00
  • Javafx简单实现【我的电脑资源管理器】效果

    下面是详细讲解“Javafx简单实现【我的电脑资源管理器】效果”的完整攻略: 1. 准备工作 在进行Javafx开发前,我们需要先安装好开发所需的环境,包括JDK和IDE。这里我们选择JDK1.8和Intellij IDEA作为开发环境。具体安装方法这里不作过多说明,可以参考官方文档进行安装。 2. 建立项目 使用Intellij IDEA创建一个新的Jav…

    Java 2023年5月24日
    00
  • java实现文件上传、下载、图片预览

    Java实现文件上传、下载、图片预览的完整攻略 上传文件 首先在前端页面设计一个上传文件的form表单,并设置enctype为multipart/form-data。form表单提交时,浏览器会解析其中的文件,并将其封装到一个HTTP请求中,在请求的正文中发送到服务器。 <form action="/upload" method=&…

    Java 2023年5月19日
    00
  • Java基于线程实现带有滚动效果的Label标签实例

    下面我将详细讲解如何实现Java基于线程实现带有滚动效果的Label标签的完整攻略。 1. 了解需求 在实现这个功能之前,我们需要了解需求,即带有滚动效果的Label标签到底是什么,有什么功能和特点。经过了解,我们知道: 带有滚动效果的Label标签是一种标签,可以显示文字、图片等内容。 它的滚动效果可以是从左到右、从右到左、从上到下、从下到上等四个方向中的…

    Java 2023年6月15日
    00
  • Spring Security自定义登录页面认证过程常用配置

    下面我就为您详细讲解“Spring Security自定义登录页面认证过程常用配置”的攻略。 先决条件 在开始自定义登录页面的配置之前,您需要了解以下先决条件: 您已经学会了Spring Security的基本用法; 您已经熟悉了Spring Boot和Thymeleaf。 配置步骤 接下来,我将为您介绍几个常用的自定义登录页面的配置步骤: 第1步:创建登录…

    Java 2023年6月3日
    00
  • 使用maven编译Java项目实例

    使用Maven编译Java项目的完整攻略,主要分为以下几个步骤: Step 1:准备工作 在开始编译Java项目之前,需要确保已经安装好了以下软件和环境: JDK:确保已经安装了JDK,并设置了JAVA_HOME环境变量。 Maven:需要先安装Maven,并将其添加到PATH环境变量中。 Step 2:创建项目 在本地计算机上创建一个Java项目,并使用M…

    Java 2023年5月20日
    00
  • java如何实现字符串中的字母排序

    要实现字符串中字母的排序,我们可以使用Java中的字符数组和字符串操作。 步骤如下: 首先,从输入的字符串中创建一个字符数组。 然后,使用Java中提供的排序算法,对字符数组进行排序。 重新构建一个字符串,该字符串是排好序的字符数组的字符串表示形式。 以下是一个示例程序,它演示了如何在Java中实现对字符串中字母的排序: 示例1:使用冒泡排序对字符数组进行排…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部