6

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

原因:java.lang.IllegalArgumentException:不受支持的 ISO 3166 国家:在 org.java.util.Currency.getInstance(Currency.java:81) 的 en_UK。

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

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

有人有这方面的经验吗?谢谢。

4

4 回答 4

10

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);
于 2012-11-10T12:18:25.320 回答
1

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

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

于 2017-05-03T15:01:41.267 回答
0

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

普通用户不能选择 en-UK 或任何其他无效的语言环境。

于 2021-06-21T08:39:29.900 回答
-1
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);
于 2017-06-02T07:08:34.943 回答