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

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

NumberFormat format = NumberFormat.getCurrencyInstance(locale); 

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

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

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

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

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

这样,您还可以保留货币符号和小数位数的正确位置。 一些示例,对于default-Locale 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)); 

您可以使用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"