使用Locale格式化BigDecimal到Locale特定的货币字符串(languageCode,countryCode)

时间:2017-10-29 07:51:45

标签: java formatting internationalization locale currency

我正在使用Locale(languageCode,countryCode)构造函数将BigDecimal货币值转换为特定于区域设置的货币格式,如下面的代码所示

public static String formatCurrency(BigDecimal amount, String languageCode, String countryCode) {

    Format format = NumberFormat.getCurrencyInstance(new Locale(languageCode, countryCode));
    String formattedAmount = format.format(amount);
    logger.debug("Orginal Amount {} and Formatted Amount {}", amount, formattedAmount);
    return formattedAmount;
}

现在根据Oracle Docs

的优秀资源
  

运行时环境不要求每个区域设置敏感的类都同等地支持所有语言环境。每个区域设置敏感的类都实现了对一组语言环境的自己的支持,并且该组可以在类与类之间不同。例如,数字格式类可以支持与日期格式类不同的语言环境集。

由于我的languageCode和countryCode是由User输入的,当用户输入错误的输入时,如何处理这种情况(或者说NumberFormat.getCurrencyInstance方法如何处理它),例如languageCode = de和countryCode = US。 / p>

是否默认为某些区域设置?如何处理这种情况。

感谢。

1 个答案:

答案 0 :(得分:2)

根据@artie的建议,我使用LocaleUtil.isAvailableLocale来检查语言环境是否存在。如果它是一个无效的Locale,我将它转到en_US。这在一定程度上解决了这个问题。

但是,它仍然没有解决检查NumberFormat是否支持该Locale的问题。将接受解决此问题的任何其他答案。

   public static String formatCurrency(BigDecimal amount, String languageCode, String countryCode) {

        Locale locale = new Locale(languageCode, countryCode);
        if (!LocaleUtils.isAvailableLocale(locale)) {
            locale = new Locale("en", "US");
        }
        Format format = NumberFormat.getCurrencyInstance(locale);
        String formattedAmount = format.format(amount);
        logger.debug("Orginal Amount {} and Formatted Amount {}", amount, formattedAmount);
        return formattedAmount;
    }