首页 > 解决方案 > 有没有办法在基于地区设置货币时获得一致的输出

问题描述

我们正在根据区域设置格式化数值,但我们发现当我们用不同的编程语言生成输出时,生成的输出是不同的。而且我也不确定哪个输出是正确的。

在java中:

//https://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html
import java.text.NumberFormat

double money = 987654.32
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("ar", "DZ"))
System.out.println(formatter.format(money))
formatter = NumberFormat.getCurrencyInstance(new Locale("bg", "BG"))
System.out.println(formatter.format(money))

输出:

د.ج.‏ 987,654.32
лв.987 654,32

在 JavaScript 中:

//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
var number = 987654.32;
console.log(new Intl.NumberFormat('ar-DZ', { style: 'currency', currency: 'DZD' }).format(number));
console.log(new Intl.NumberFormat('bg-BG', { style: 'currency', currency: 'BGN' }).format(number));

输出:

د.ج.‏ 987.654,32
987654,32 лв.

在 C# 中:

var amount = 987654.32M;
var cultureInfo = CultureInfo.GetCultureInfo("ar-DZ");
var formattedAmount = String.Format(cultureInfo, "{0:C}", amount);
Console.WriteLine(formattedAmount);

cultureInfo = CultureInfo.GetCultureInfo("bg-BG");
formattedAmount = String.Format(cultureInfo, "{0:C}", amount);
Console.WriteLine(formattedAmount);

输出:

د.ج.‏ 987,654.32
987 654,32 лв.

如您所见,千位分隔符以及货币符号的位置不同。有没有一种方法可以解决这种差异,或者您是否知道更可靠的库可能应该比这些解决方案更受信任?

标签: javascriptjavac#currency-formatting

解决方案


本地化是一个复杂的过程。有超过 200 种语言,超过 500 种地区变体。虽然这已经是一项艰巨的学术任务,但还要加上政治问题和政府指令。划定在语言和文化上适当的内容是一项艰巨的任务。即便如此,随着规范的变化和演变,它们也会随着时间而变化。

增加这个困难的事实是,在计算中,我们有多个来源可以从中获取语言和文化定义。并且这些来源中的每一个都会随着更高版本而变化。

因此,将所有这些加在一起,难怪您会看到跨编程语言和部署平台的不同本地化结果。

本地化定义的一个常见来源来自大多数操作系统中可用的标准 C 库。众所周知,供应商对问题的复杂性和细节感到不知所措,并且表现不佳。您应该尽可能避免使用此来源。

在某些平台上,例如 macOS,我们可以找到更高级别的框架,更好地处理本地化信息。

最好的跨平台源代码是CLDR定义文件和ICU库,两者均由 Unicode Consortium 提供。Java 的更高版本现在默认使用这些。某些数据库系统如Postgres4D也是如此。


推荐阅读