Java 与区域设置不同的货币的货币格式

Java 与区域设置不同的货币的货币格式,java,android,Java,Android,在Android上,我试图用特定的数字格式格式化一些货币 我的号码必须使用法语格式(9 876 543,21)进行格式化,但货币符号的位置应取决于货币: 9 876 543,21欧元欧元 $9876543,21美元 这是我现在的代码(它使用java.util类,但结果与android.icu包相同): 输出为9876543,21美元,因为我的数字格式使用的是法语区域设置 注意:地区必须是法国(或法语)才能有良好的数字格式,我实际上不知道货币代码(例如欧元、美元或英镑),它将只是一个来自Web

在Android上,我试图用特定的数字格式格式化一些货币

我的号码必须使用法语格式(
9 876 543,21
)进行格式化,但货币符号的位置应取决于货币:

  • 9 876 543,21欧元
    欧元
  • $9876543,21
    美元
这是我现在的代码(它使用
java.util
类,但结果与
android.icu
包相同):

输出为
9876543,21美元
,因为我的数字格式使用的是法语区域设置

注意:地区必须是法国(或法语)才能有良好的数字格式,我实际上不知道货币代码(例如欧元、美元或英镑),它将只是一个来自Web服务的字符串


有没有办法告诉格式化程序我想要法文数字格式,但它需要尊重符号的货币位置?

这非常有效,我想这就是您想要实现的目标

    final Double of = Double.valueOf("9876543.21");

    NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("EUR"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("GBP"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("SEK"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("USD"));
    Log.d("test", currencyInstance.format(of));

private Locale getLocalFromISO(String iso4217code){
    Locale toReturn = null;
    for (Locale locale : NumberFormat.getAvailableLocales()) {
        String code = NumberFormat.getCurrencyInstance(locale).
                getCurrency().getCurrencyCode();
        if (iso4217code.equals(code)) {
            toReturn = locale;
            break;
        }
    }
    return toReturn;
}
//Prints  
//9.876.543,21 €
//£9,876,543.21
// 9 876 543,21 kr
//US$9,876,543.21

嗨,我的问题是我不知道代码中的货币。我只从Web服务获取ISO代码(USD、EUR、GBP),因此无法为数字格式使用适当的区域设置。在你的例子中,美元的输出应该是在我的例子中,
$9 876 543,21
(法语格式,数字前带有货币符号)。我明白了,你不能只使用一个开关,或者一个嵌套的if语句吗?如果你从服务器上获得美元,你可以设置
currencyInstance
给我们如果你获得欧元,你可以选择像法国这样的欧元国家,因为你只有几个,我认为这应该不会有问题,因为这是一个银行应用程序,理论上我可以获得任何货币代码,如欧元、美元、瑞典克朗、丹麦克朗,CAD等…这是很好的找到适当的本地显示最佳货币符号,但它仍然会打破数字格式。我想我想要的是标准的
NumberFormat
。谢谢你的努力,我会保留你的代码,以防我需要实现一些真正定制的东西。你确定要根据货币使用符号吗?快速浏览一下网络,符号的位置似乎是由显示区域而不是货币决定的(因此在法语区域尾随$似乎是正确的)。这是我从网络阅读中学到的。但我刚刚被告知要实现这样的货币格式,我想知道是否可以用标准的NumberFormatter实现。我可能应该开始游说“商业”人士,让他们简单地用标准化格式格式化货币……看看这个库
    final Double of = Double.valueOf("9876543.21");

    NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("EUR"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("GBP"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("SEK"));
    Log.d("test", currencyInstance.format(of));
    currencyInstance = NumberFormat.getCurrencyInstance(getLocalFromISO("USD"));
    Log.d("test", currencyInstance.format(of));

private Locale getLocalFromISO(String iso4217code){
    Locale toReturn = null;
    for (Locale locale : NumberFormat.getAvailableLocales()) {
        String code = NumberFormat.getCurrencyInstance(locale).
                getCurrency().getCurrencyCode();
        if (iso4217code.equals(code)) {
            toReturn = locale;
            break;
        }
    }
    return toReturn;
}
//Prints  
//9.876.543,21 €
//£9,876,543.21
// 9 876 543,21 kr
//US$9,876,543.21