在我的应用中,我使用Locale.getDefault()
获取用户的默认场所,然后将其传递给Currency.getInstance(Locale)
。它主要有效,但是我已经开始从用户那里获取报告,这些报告显示了堆栈跟踪中的以下IllegalArgumentException
:
引起的: 国家/地区:EN_UK,java.util.currency.getinstance(crurner.java:81) org。
我希望Android只能返回有效的地区,但事实并非如此。
如何处理此类案例以确保我只能获得有效的ISO 3166环境?简单的方法是处理这种特殊情况,但是如果有一个,我宁愿使用通用解决方案。
有人对此有经验吗?谢谢。
ISO 3166英国的两个字母缩写不是UK
,正确的ID是GB
。UK
出于兼容原因(过去犯了一个错误)。
我确实在寻找其他探测,但没有找到任何东西,所以现在我只处理特殊情况。
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);