0

我有一个使用这个类的应用程序:java.util.Currency

在应用程序中,我维护一个国家代码到语言环境的地图。我通过传入国家/地区代码来检索语言环境

当我将此语言环境传递给 时Currency.getInstance(),它会返回正确的货币。我通过调用验证了这一点Currency.getCurrencyCode()

但是,当我调用getDisplayName()同一个货币实例时,它会返回null

这种行为不会发生在我的开发机器上,只会发生在我的测试服务器上

我的开发机器和服务器都使用 Ubuntu 12.04 LTS:

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

该应用程序在tomcat中运行

我可能在这里遗漏了一些东西

编辑

import java.util.Currency;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

...

public static Map<String, Locale> COUNTRY_TO_LOCALE_MAP;

public static void initCountryToLocaleMap() {
    if (COUNTRY_TO_LOCALE_MAP != null) {
        return;
    }

    COUNTRY_TO_LOCALE_MAP = new HashMap<String, Locale>();

    Locale[] locales = Locale.getAvailableLocales();

    for (Locale l : locales) {
        COUNTRY_TO_LOCALE_MAP.put(l.getCountry(), l);
    }
}

public static Locale getLocaleFromCountryCode(String countryCode) {
    if (countryCode == null) {
        return null;
    }

    initCountryToLocaleMap();

    Locale locale = COUNTRY_TO_LOCALE_MAP.get(countryCode);

    if (locale == null) {
        return new Locale("", countryCode);
    }

    return locale;
}

public static void main(String args[]) {
    initCountryToLocaleMap();

    String countryCode = "ZA";
    Locale locale = getLocaleFromCountryCode(countryCode);
    Currency currency = Currency.getInstance(locale);

    System.out.println("currencyCode: " + currency.getCurrencyCode());
    System.out.println("displayName: " + currency.getDisplayName());
}

运行 main() 后,我得到以下输出:来自开发机器:

currencyCode: ZAR
displayName: South African Rand

从测试服务器:

currencyCode: ZAR
4

2 回答 2

0

您正在调用:

Locale.getAvailableLocales();

用 key as和 value as填充你的COUNTRY_TO_LOCALE_MAP映射。countryLocale

问题是世界上所有国家和地区之间没有一对一的映射。例如,您将在列表中获得许多空白的本地条目country。由于该行为,您在地图中多次插入一个空键。

是的,您正在查找的国家/地区ZA也没有返回。这就是您返回 null 的原因。

语言环境实际上代表区域。它们旨在标记语言、货币等内容。

于 2013-09-09T15:47:30.893 回答
0

Currency 类的javadoc表明该方法getDisplayName()是 Java 1.7 版中的新方法。尝试使用 JDK 1.7 版本运行 Tomcat。

如果 Tomcat 只是默默地失败并返回 null,我会感到惊讶。您是否检查了 Tomcat 日志以查看是否有任何异常?

于 2013-09-09T15:06:37.320 回答