仅在JVM中使用Android ICU NumberFormat



Android有ICU库NumberFormat,它允许以不同的方式格式化货币,在我的特定情况下,我需要它作为ISOCURRENCYSTYLE。这很好用,但只适用于Android。

Java作为自己的NumberFormat实现,带有一个名为getCurrencyInstance的实例生成器,该生成器在内部使用默认货币样式,不允许指定它。

其中一些差异是:

BE_FR | Android: 123,12 EUR |   Java: 123,12 €
BE_NL | Android: EUR 123,12 |   Java: € 123,12
BE_EN | Android: EUR 123.12 |   Java: €123,12
GE_GE | Android: EUR 123.12 |   Java: €123.12
FR_FR | Android: 123,12 EUR |   Java: 123,12 €

有没有一种方法可以在JVM中获得相同的Android输出,而不使用任何外部库?

解决方案是将DecimalFormat的前缀和后缀替换为货币代码:

import java.text.*;
import java.util.Locale;
public class Test
{
public static DecimalFormat geCurrencyFormat(Locale locale)
{
DecimalFormat df = (DecimalFormat)NumberFormat.getCurrencyInstance(locale);
String code = df.getCurrency().getCurrencyCode();
if(!df.getPositivePrefix().isEmpty())
{
df.setPositivePrefix(code + " ");
df.setNegativePrefix(code + " -");
}
if(!df.getPositiveSuffix().isEmpty())
{
df.setPositiveSuffix(" " + code);
df.setNegativeSuffix(" " + code);
}
return df;
}
public static void test(Locale locale)
{
DecimalFormat df = geCurrencyFormat(locale);
System.out.println(df.format(123.12));
}
public static void main(String args[])
{
test(new Locale("fr", "BE"));
test(new Locale("nl", "BE"));
test(new Locale("en", "GB"));
}
}

输出:

123,12 EUR
EUR 123,12
GBP 123.12

很遗憾没有。你可以使用Currency和手工制作的东西来获得三个字母的ISO 4217代码,比如:

Locale locale = Locale.FRANCE;
float amount = 123.1f;
NumberFormat nf = NumberFormat.getInstance(locale);
Currency currency = Currency.getInstance(locale);
String formattedAmount = nf.format(amount) + " " + currency.getCurrencyCode());

然而,Android正在使用ICU代码来正确排序货币字符串中的值和单位。这不在标准Java JDK中。

我知道您不想使用库,所以这超出了所需答案的范围。但是,如果您选择使用库,请查看ICU4Jhttps://unicode-org.github.io/icu/userguide/icu4j/.它包括一个NumberFormatISOCURRENCYSTYLE与Android行为相匹配。

最新更新