我使用NumberFormat.getCurrencyInstance(Locale locale)来呈现价格值。据我所知,locale的国家定义了货币,而locale的语言定义了要呈现的样式。但是当使用Locale(“en”,“DE”)时,它的工作方式不同,如下面的测试所示:
@ParameterizedTest
@CsvSource(
value = [
"de; DE; 1,23 €",
"de; GB; 1,23 £",
"en; GB; £1.23",
"en; DE; €1.23", // <- fails because result is "1,23 €"
],
delimiter = ';',
)
fun `formatting`(givenLanguage: String, givenCountry: String, expectedResult: String) {
assertEquals(
expectedResult,
NumberFormat.getCurrencyInstance(Locale(givenLanguage, givenCountry)).format(1.23)
)
}
基于currencyCode对所有内容进行格式设置,工作正常
val nf = NumberFormat.getCurrencyInstance(Locale("en")) // no country "DE"
nf.currency = Currency.getInstance("EUR")
println(nf.format(1.23))
// => €1.23
但在此处添加国家“de”会导致相同的问题
val nf = NumberFormat.getCurrencyInstance(Locale("en", "DE"))
nf.currency = Currency.getInstance("EUR")
println(nf.format(1.23))
// => 1,23 €
有人能解释一下吗?
1条答案
按热度按时间xdnvmnnf1#
我提出的解决方案是永远不要将国家传递给
NumberFormat.getCurrencyInstance(Locale locale)
的Locale-argument,而是从国家中提取货币,并直接在NumberFormat
示例中定义它,这非常笨拙。实际上我是这样做的:
旁注:
在某些情况下,格式化使用货币代码,而不是符号。例如,西班牙语中的英镑(
language="es"
,country="GB"
)被格式化为1,23 GBP
而不是1,23 £
。因此,如果有人想总是使用货币符号,我建议总是用currencySymbol
替换currencyCode
: