如何使用非ISO 3166国家/地区创建货币实例,例如en_UK?

时间:2012-11-09 22:05:13

标签: java android locale

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

  

引起:java.lang.IllegalArgumentException:不支持的ISO 3166   country:en_UK at java.util.Currency.getInstance(Currency.java:81)at   有机

我希望Android只返回有效的语言环境,但显然并非如此。

如何处理此类情况以确保我只获得有效的ISO 3166区域设置?简单的方法是处理这种特殊情况,但如果有的话,我宁愿使用通用解决方案。

任何人都有这方面的经验吗?感谢。

4 个答案:

答案 0 :(得分:9)

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

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

Locale loc = new Locale("en","UK"); // test code

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

答案 1 :(得分:0)

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;
}

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

答案 2 :(得分:0)

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);

答案 3 :(得分:0)

您的用户(启用了开发设置)或测试人员手动设置了一个奇怪且无效的国家/地区。我们发现了这个错误,但结果证明我们的测试人员已将 Appium 配置为将设备区域设置为 en-UK :)。

普通用户不能选择 en-UK 或任何其他无效的区域设置。