如何使用非ISO 3166国家(如en_uk)创建货币实例



在我的应用中,我使用Locale.getDefault()获取用户的默认场所,然后将其传递给Currency.getInstance(Locale)。它主要有效,但是我已经开始从用户那里获取报告,这些报告显示了堆栈跟踪中的以下IllegalArgumentException

引起的: 国家/地区:EN_UK,java.util.currency.getinstance(crurner.java:81) org。

我希望Android只能返回有效的地区,但事实并非如此。

如何处理此类案例以确保我只能获得有效的ISO 3166环境?简单的方法是处理这种特殊情况,但是如果有一个,我宁愿使用通用解决方案。

有人对此有经验吗?谢谢。

ISO 3166英国的两个字母缩写不是UK,正确的ID是GBUK出于兼容原因(过去犯了一个错误)。

我确实在寻找其他探测,但没有找到任何东西,所以现在我只处理特殊情况。

Locale loc = new Locale("en","UK"); // test code
if(loc.getCountry().equals("UK")){
    loc = new Locale(loc.getLanguage(), "GB");
    }
Currency cur = Currency.getInstance(loc);

Currency.getInstance(...)期望表单" en_us"的语言环境,但是, Locale.getDefault()并不总是返回此表单的环境。

要防止应用程序中崩溃,您可以使用类似的内容:

public static String getCurrencySymbol(){
    String cursym;
    try {
        cursym = Currency.getInstance(Locale.getDefault()).getSymbol();
    } catch (IllegalArgumentException e) {
        cursym = "?"; // default symbol
    }
    return cursym;
}

您可以尝试找出一种更好的方法来获取最合适的符号,或者让用户选择一个。

您的用户(启用开发设置)或测试人员手动设置了一个怪异而无效的国家。这个错误发生在我们身上,但事实证明,我们的测试人员已经配置了Appium将设备环境设置为en-UK :)。

普通用户无法选择EN-UK或任何其他无效的环境。

String symbolLocale ="";
int localeLength = mLocale.split("-").length;
if (localeLength == 2) {
    symbolLocale = new Locale(
        mLocale.split("-", 2)[0], 
        mLocale.split("-", 2)[1]
    );
} else if (localeLength == 3) {
    symbolLocale = new Locale(
        mLocale.split("-", 3)[0] + "-" + 
        mLocale.split("-", 3)[1], 
        mLocale.split("-", 3)[2]
    );
}
symbolString = Currency.getInstance(symbolLocale).getSymbol(symbolLocale);

最新更新