在我的应用中,我使用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区域设置?简单的方法是处理这种特殊情况,但如果有的话,我宁愿使用通用解决方案。
任何人都有这方面的经验吗?感谢。
答案 0 :(得分:9)
英国的ISO 3166双字母缩写不是UK
,正确的ID是GB
。 UK
是出于兼容性原因(过去犯了错误)。
我确实在寻找其他的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 或任何其他无效的区域设置。