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

gri*_*rdo 4 java formatting locale

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

NumberFormat format = NumberFormat.getCurrencyInstance(locale);  
Run Code Online (Sandbox Code Playgroud)

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

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

tob*_*s_k 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;
}
Run Code Online (Sandbox Code Playgroud)

这样,您还可以保留货币符号和小数位数的正确位置.一些示例,默认为LocaleLocale.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
Run Code Online (Sandbox Code Playgroud)

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

localDfs.setCurrencySymbol(df.getCurrency().getSymbol(locale));
Run Code Online (Sandbox Code Playgroud)


Jea*_*ard 5

您可以指定在货币符号NumberFormatsetCurrency方法.

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

format.setCurrency(Currency.getInstance("EUR"));
Run Code Online (Sandbox Code Playgroud)

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

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

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