格式化

GWT 并未为日期和数字格式化类(java.text.DateFormat、java.text.DecimalFormat、java.text.NumberFormat、java.TimeFormat 等)提供完整的模拟。相反,JRE 类功能的子集由 com.google.gwt.i18n.client.NumberFormatcom.google.gwt.i18n.client.DateTimeFormat 提供。

标准 Java 类和 GWT 类之间的主要区别在于在运行时切换不同区域设置以格式化日期和数字的能力。在 GWT 中,延迟绑定 机制用于仅将当前区域设置所需的逻辑加载到应用程序中。

为了使用 NumberFormatDateTimeFormat 类,您应该使用以下 inherits 行更新您的 模块 XML 文件

<inherits name="com.google.gwt.i18n.I18N"/>

有关设置区域设置的更多信息,请参阅 国际化主题

  1. 使用 NumberFormat
  2. 使用 DateTimeFormat

使用 NumberFormat

使用 NumberFormat 类时,您不会直接实例化它。相反,您可以通过调用其静态 get...Format() 方法之一来检索实例。在大多数情况下,您可能希望使用默认的十进制格式

NumberFormat fmt = NumberFormat.getDecimalFormat();
    double value = 12345.6789;
    String formatted = fmt.format(value);
    // Prints 1,2345.6789 in the default locale
    GWT.log("Formatted string is" + formatted, null);

该类还可以用于将数字字符串转换回双精度数

double value = NumberFormat.getDecimalFormat().parse("12345.6789");
    GWT.log("Parsed value is" + value, null);

NumberFormat 类还提供科学记数法的默认值

double value = 12345.6789;
    String formatted = NumberFormat.getScientificFormat().format(value);
    // prints 1.2345E4 in the default locale
    GWT.log("Formatted string is" + formatted, null);

请注意,您还可以指定自己的模式以格式化数字。在下面的示例中,我们希望在小数点右侧显示 6 位精度,并在左侧使用零格式化到十万位

double value = 12345.6789;
    String formatted = NumberFormat.getFormat("000000.000000").format(value);
    // prints 012345.678900 in the default locale
    GWT.log("Formatted string is" + formatted, null);

以下是十进制格式中最常用的模式符号

符号 含义
0 数字,强制为零
# 数字,零显示为缺失
. 小数点分隔符或货币小数点分隔符
- 减号
, 分组分隔符

指定无效模式将导致 NumberFormat.getFormat() 方法抛出 java.lang.IllegalArgumentExceptionpattern 规范非常丰富。有关完整的功能集,请参阅 类文档

如果您将多次使用相同的数字格式模式,则最有效的方法是缓存从 NumberFormat.getFormat(pattern) 返回的格式句柄。

使用 DateTimeFormat

GWT 提供了 DateTimeFormat 类来替代 JRE 中的 DateFormatTimeFormat 类的功能。

对于 DateTimeFormat 类,定义了大量默认格式。

Date today = new Date();

    // prints Tue Dec 18 12:01:26 GMT-500 2007 in the default locale.
    GWT.log(today.toString(), null);

    // prints 12/18/07 in the default locale
    GWT.log(DateTimeFormat.getShortDateFormat().format(today), null);

    // prints December 18, 2007 in the default locale
    GWT.log(DateTimeFormat.getLongDateFormat().format(today), null);

    // prints 12:01 PM in the default locale
    GWT.log(DateTimeFormat.getShortTimeFormat().format(today), null);

    // prints 12:01:26 PM GMT-05:00 in the default locale
    GWT.log(DateTimeFormat.getLongTimeFormat().format(today), null);

    // prints Dec 18, 2007 12:01:26 PM in the default locale
    GWT.log(DateTimeFormat.getMediumDateTimeFormat().format(today), null);

NumberFormat 类类似,您也可以使用此类将日期从 String 解析为 Date 表示形式。您还可以选择使用日期和时间组合的默认格式,或者使用模式字符串构建自己的格式。有关如何创建自己的模式的详细信息,请参阅 DateTimeFormat 类文档。

在偏离默认格式并定义自己的模式时要谨慎。错误显示日期和时间会极大地激怒国际用户。请考虑以下日期

12/04/07

在某些国家/地区,这表示 2007 年 12 月 4 日,而在其他国家/地区,则表示 2007 年 4 月 12 日,在另一个区域设置中,它可能表示 2012 年 4 月 7 日。为了以这种通用格式显示,请使用默认格式,并让 DateTimeFormat 中的本地化机制为您完成工作。