我的应用使用以下代码获取本地货币:
Locale locale = Locale.getDefault()
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);
这在我的所有测试中都很好用,以前从来都不是问题。今天我在Google Play开发者控制台中看到了一个CrashLog:该应用程序崩溃了:
java.lang.IllegalArgumentException: Unsupported ISO 3166 country: es
使用new Locale("es")
代替Locale.getDefault()
时,我可以轻松重现此错误:
Locale locale = new Locale("es");
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);
实际上,无论我使用的语言代码是什么,都会抛出相同的异常,例如: " en"," de"," fr"等等。只有在指定了国家代码的情况下,everthing才能正常工作,例如new Locale("es", "ES")
我有两个异常问题:
1。为什么" es"不是有效的区域设置?我理解的区域设置名称由语言代码(小写)和可选国家/地区代码组成。因此es-ES
将是一个有效的区域设置,但是" es"应该也是,不应该吗?
2。我该怎么做才能避免这个问题呢?我在整个应用程序中使用Locale.getDefault()
来为用户提供区域设置货币,区域设置编号格式等。我会假设系统始终返回有效的区域设置,但这是显然不是这样的。如何确保使用有效的区域设置?
答案 0 :(得分:2)
我也有这个问题,我觉得目前的答案是不完整的。当您在Firebase虚拟机上运行时会弹出此问题(您也可以通过选择相应的语言区域设置(例如en,de,es等)在模拟器上执行此操作。)
我通过创建一个自定义类来解决这个问题,该类使用try:
检索货币会计失败public static Locale getLocalCurrency() {
try {
return Currency.getInstance(Locale.getDefault());
} catch (NullPointerException | IllegalArgumentException ex) {
return Currency.getInstance(new Locale("en", "US"));
}
}
这基本上假设如果失败,它将返回美国的语言环境。这可以很容易地扩展到检测语言,即es,并返回相关的默认值。
我已将此扩展到我使用Locale以确保安全的所有点。
希望能帮助其他任何看过这里的人。
答案 1 :(得分:0)
你应该注意这个:
http://docs.oracle.com/javase/7/docs/api/java/util/Currency.html#getInstance(java.util.Locale)
如果您指定语言而没有国家/地区,则系统无法确定货币。