具有另一种数字格式的货币符号

Currency symbol with another number format

我想知道是否有一种优雅的方法可以以一种方式设置数字的货币格式,而以另一种方式保留实际的数字格式。是Java。本质上我是这样做的

NumberFormat format = NumberFormat.getCurrencyInstance(locale);  

这基本上没问题,除了我正在为英国用户编写一个系统,而我的用户很不高兴,因为在显示(例如)欧元时,该数字被格式化为欧洲人会使用的格式。所以 500,000 欧元,就像英国人会写的那样,它显示为 500.000 欧元(即交换 ,换 .)。我本来打算将区域设置换成 locale.UK,但我会得到错误的货币符号!

我对此有一些肮脏的修复,但我想知道是否有一种优雅的方法可以使语言环境的货币符号与本地语言环境 (locale.UK) 数字格式保持一致。

您可以使用 setCurrency 方法在 NumberFormat 上指定货币符号。

然后只需使用 Locale.UK 即可显示正确的分组分隔符。

format.setCurrency(Currency.getInstance("EUR"));

请注意,为了更好地处理 grouping/decimal 分隔符,您可能需要使用 DecimalFormat

DecimalFormatSymbols custom=new DecimalFormatSymbols();
custom.setDecimalSeparator('.');
custom.setGroupingSeparator(',');
DecimalFormat format = DecimalFormat.getInstance();
format.setDecimalFormatSymbols(custom);
format.setCurrency(Currency.getInstance("EUR"));

然后指定正确的模式,例如"€ ###,###.00"

不同的货币也可以在字符串前后放置货币符号,或者有不同的小数位数(如果有的话)。从你的问题中并不清楚你想如何处理这些情况,但假设你想保留这些差异,试试这个。

您可以从外国格式开始,将小数格式符号替换为您的本地版本,而不是仅仅将货币符号换成本地数字格式。这些还包括货币,因此您必须将其换回(别担心,这是一个副本)。

public static NumberFormat localStyleForeignFormat(Locale locale) {
    NumberFormat format = NumberFormat.getCurrencyInstance(locale);
    if (format instanceof DecimalFormat) {
        DecimalFormat df = (DecimalFormat) format;
        // use local/default decimal symbols with original currency symbol
        DecimalFormatSymbols dfs = new DecimalFormat().getDecimalFormatSymbols();
        dfs.setCurrency(df.getCurrency());
        df.setDecimalFormatSymbols(dfs);
    }
    return format;
}

这样,您还可以保留货币符号的正确定位和小数位数。一些示例,对于默认语言环境 Locale.UK

en_GB   £500,000.00     £500,000.00
fr_FR   500 000,00 €    500,000.00 €
it_IT   € 500.000,00    € 500,000.00
ja_JP   ¥500,000       JPY500,000
hi_IN   रू ५००,०००.००    INR 500,000.00

如果您还想保留外币符号,而不是本地货币符号,请使用

localDfs.setCurrencySymbol(df.getCurrency().getSymbol(locale));