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

Posted

技术标签:

【中文标题】具有另一种数字格式的货币符号【英文标题】:Currency symbol with another number format 【发布时间】:2015-03-23 16:16:34 【问题描述】:

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

NumberFormat format = NumberFormat.getCurrencyInstance(locale);  

这基本上很好,除了我正在为英国用户编写一个系统并且我的用户在显示(例如)欧元时,数字被格式化为欧洲人会使用它时感到不安。因此,作为英国人的 500,000 欧元将显示为 500,000 欧元(即 swap ,for .)。我打算用 locale.UK 交换语言环境,但我会得到错误的货币符号!

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

【问题讨论】:

你使用的那些“丑陋的修复”是什么,所以我们知道我们的想法是否更好? 不同的货币也将货币符号放在字符串之前或之后,或者有不同的小数位数。您是否也想保留这些差异,还是只想换取正确的货币符号? 实际上我的丑陋修复主要只是解析字符串的不同方式,就在我发布这个之后,有人给我发了一个卢比的例子(类似于下面的例子),我意识到我低估了这个问题. 【参考方案1】:

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

您可以从外国格式开始,然后用本地版本替换十进制格式符号,而不是将货币符号换成本地数字格式。这些还包括货币,所以你必须把它换回来(别担心,它是一个副本)。

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

【讨论】:

【参考方案2】:

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

然后只需使用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"

【讨论】:

不同的货币也有不同的小数位数等。有些可能比Locale.UK 规定的要多,有些则少。此外,有的将货币放在数字之前,有的放在数字之后。 @tobias_k 从给定的示例中,该模式似乎是正确的。无论如何,我编辑了另一个例外来处理自定义格式。 非常感谢。两个答案都满足了我的需求,很抱歉选择 1 而不是另一个! @gringogordo 完全没问题 :) 我也赞成另一个答案。很高兴你解决了你的问题。

以上是关于具有另一种数字格式的货币符号的主要内容,如果未能解决你的问题,请参考以下文章

text SQL中具有货币(ISO代码和符号)格式的国家/地区列表。

ACCESS,货币数据类型等价于具有啥属性的数据数字类型?

Intl.NumberFormat 返回数字和货币符号通过间距划分的结果

获取货币符号角度 2

论数字货币的法律属性

使用没有货币代码的货币格式