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日

相关文章

  • Spring系列之事物管理

    Spring系列之事物管理攻略 在大型应用程序中,数据库事务管理是至关重要的。Spring框架为我们提供了强大的事务管理功能。本文将介绍Spring事物管理的完整攻略,包括配置和示例。 事物管理的重要性 事务是指一组操作,它们可以被看作是一个单一的工作单元。在应用程序中,有些操作必须一起执行,否则将导致数据丢失或数据不一致的问题。事务可以保证这些操作被视为一…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“ObjectNotFoundException”的原因与解决方法

    “BaseRuntimeException”是Java的Struts框架中的一个异常,通常由以下原因之一引起: 无效的操作:如果操作无效,则可能会出现此错误。在这种情况下,需要检查操作以解决此问题。 无效的配置:如果配置无效,则可能会出现此错误。在这种情况下,需要检查配置以解决此问题。 以下是两个实例: 例1 如果操作无效,则可以尝试检查操作以解决此问题。例…

    Java 2023年5月5日
    00
  • 如何进行Java性能调优?

    如何进行Java性能调优? Java性能调优主要是通过一系列的措施来减少应用程序消耗的资源,提高程序的性能。一般通过以下几个步骤来进行Java性能调优: 分析异常现象和性能问题,并定位问题根源 首先需要收集一些关键指标以判断Java应用程序的健康状况。例如:CPU使用率、内存使用率、线程数、网络I/O等等。然后根据这些指标,在出现异常或性能瓶颈的时候,对应用…

    Java 2023年5月11日
    00
  • Eclipse中使用Maven创建Java Web工程的实现方式

    创建Java Web工程有多种方式,其中一种常用的方式就是使用Maven构建工具。下面我将详细讲解如何在Eclipse中使用Maven创建Java Web工程的实现方式,包括如下几个步骤: 安装Maven插件 创建Maven Web项目 添加Web和Servlet依赖 编写Servlet程序 配置并运行Tomcat服务器 下面逐一进行详细讲解: 1. 安装M…

    Java 2023年5月20日
    00
  • 大公司为什么禁止SpringBoot项目使用Tomcat?

    前言 在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?本文将为大家细细讲解。 …

    Java 2023年4月18日
    00
  • SpringMVC 方法四种类型返回值总结(你用过几种)

    SpringMVC 方法四种类型返回值总结 SpringMVC 的控制器方法可以有四种类型的返回值,这四种类型分别是: ModelAndView Model View String 下面将对这四种类型的返回值进行详细的讲解,并给出示例说明。 1. ModelAndView ModelAndView 是 Spring 框架中常用的一种返回类型。它既包含了 Mo…

    Java 2023年5月16日
    00
  • 自定义spring mvc的json视图实现思路解析

    我来详细讲解一下“自定义spring mvc的json视图实现思路解析”的完整攻略,包括以下内容: 一、实现思路概述 在使用Spring MVC进行web开发时,返回json视图是非常常见的操作。默认的情况下,Spring MVC使用Jackson库将对象转换为json格式的数据,并返回给前端。但是,在一些特殊的应用场景中,我们需要使用自定义的json视图。…

    Java 2023年5月26日
    00
  • 深度解析Java中volatile的内存语义实现以及运用场景

    深度解析Java中volatile的内存语义实现以及运用场景 什么是volatile 在Java中,volatile是一种特殊的修饰符,表示被它修饰的变量具有可见性、不保证原子性的特性。 volatile的内存语义 当一个变量被声明为volatile,Java虚拟机将保证: 变量对所有线程之间的可见性 避免指令重排 变量对所有线程之间的可见性 当一个线程修改…

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