货币符号与另一种数字格式

时间:2015-03-23 16:16:34

标签: java formatting locale

我想知道是否有一种优雅的方式来以一种方式设置数字的货币格式,但将实际的数字格式保存在另一种方式中。这是Java。基本上我在做这个

NumberFormat format = NumberFormat.getCurrencyInstance(locale);  

这很好,除了我正在为英国用户编写一个系统,我的用户感到不安的是,当显示(例如)欧元时,数字的格式是欧洲人会使用它。因此,作为英国人的500,000欧元会写出它显示为€500.000(即交换,for。)。我打算将locale替换为locale.UK,但后来我将使用错误的货币符号!

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

2 个答案:

答案 0 :(得分:8)

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

您可以从外部格式开始,并将十进制格式符号替换为您的本地版本,而不是仅将货币符号换成本地数字格式。那些也包括货币,所以你必须交换它(不用担心,它是一个副本)。

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));

答案 1 :(得分:5)

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

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

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

请注意,为了更好地处理分组/小数分隔符,您可能需要使用DecimalFormat代替。

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

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