仅在JVM中使用Android ICU数字格式

cpjpxq1n  于 2022-11-07  发布在  Android
关注(0)|答案(2)|浏览(128)

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输出,而不使用任何外部库?

6kkfgxo0

6kkfgxo01#

一种解决方案是将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
yftpprvb

yftpprvb2#

不幸的是,你可以使用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中是不存在的。
我知道您不想使用库,因此这超出了要求回答的范围。但是,如果您选择使用库,请查看ICU4J https://unicode-org.github.io/icu/userguide/icu4j/。它包含NumberFormat,其中ISOCURRENCYSTYLE符合Android行为。

相关问题