Locale.getDefault() 为 Currency.getInstance 返回不受支持/无效的区域设置

And*_*ord 6 java android locale exception

我的应用程序使用以下代码获取本地货币:

Locale locale = Locale.getDefault()
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);
Run Code Online (Sandbox Code Playgroud)

这在我所有的测试中都很好用,以前从来没有出现过问题。今天我在 Google Play Developer Console 中看到了一个 CrashLog:该应用程序崩溃了:

java.lang.IllegalArgumentException: Unsupported ISO 3166 country: es
Run Code Online (Sandbox Code Playgroud)

使用new Locale("es")代替时,我可以轻松重现此错误Locale.getDefault()

Locale locale = new Locale("es");
java.util.Currency localCurrency = java.util.Currency.getInstance(locale);
Run Code Online (Sandbox Code Playgroud)

实际上,无论我使用什么语言代码,都会抛出相同的异常,例如“en”、“de”、“fr”等。只有当还指定了国家/地区代码时,一切才能正常工作,例如 new Locale("es", "ES")

我有两个异常问题:

1. 为什么“es”不是有效的语言环境?据我所知,区域设置名称由语言代码(小写)和可选的国家/地区代码组成。因此es-ES将是一个有效的语言环境,但“es”也应该是,不是吗?

2. 我该怎么做才能避免这个问题?Locale.getDefault()在整个应用程序中使用来为用户提供语言环境货币、语言环境数字格式等。我认为系统总是返回有效的语言环境,但显然情况并非如此。我如何确保使用了有效的语言环境?

小智 0

你应该注意这一点:

http://docs.oracle.com/javase/7/docs/api/java/util/Currency.html#getInstance(java.util.Locale)

如果您指定语言但没有指定国家/地区,系统将无法确定货币。