有没有办法在基于区域设置格式化货币时获得一致的输出
Is there a way to get consistent output when fromatting currency based on locale
我们正在根据区域设置格式化数值,但我们发现当我们用不同的编程语言生成它时生成的输出是不同的。而且我也不确定哪个输出是正确的。
在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
在java脚本中:
//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 лв.
如您所见,千位分隔符以及货币符号的位置也有所不同。有没有一种方法可以解决差异,或者您是否知道比这些解决方案更值得信赖的更可靠的库?
本地化是一个复杂的过程。有 200 多种语言和 500 多种区域变体。虽然这已经成为一项艰巨的学术任务,但还要加上政治问题和政府指令。描述什么在语言和文化上是合适的是一项艰巨的任务。即便如此,随着规范的变化和发展,它们也会随着时间的推移而变化。
增加困难的是在计算中我们有多种来源可以从中获得语言和文化定义。这些来源中的每一个都随着更高版本而变化。
因此,将所有这些加在一起,难怪您会看到跨编程语言和部署平台的不同本地化结果。
本地化定义的一个常见来源是大多数 OS 中可用的标准 C 库。众所周知,供应商对问题的复杂性和细节感到不知所措,并且表现不佳。您应该尽可能避免使用此来源。
在某些平台上,例如 macOS,我们可以找到更高级别的框架,可以更好地处理本地化信息。
最好的跨平台源是 CLDR definition files and the ICU library, both provided by the Unicode Consortium. Later versions of Java now use these by default. Ditto for some database systems such as Postgres and 4D。
我们正在根据区域设置格式化数值,但我们发现当我们用不同的编程语言生成它时生成的输出是不同的。而且我也不确定哪个输出是正确的。
在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
在java脚本中:
//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 лв.
如您所见,千位分隔符以及货币符号的位置也有所不同。有没有一种方法可以解决差异,或者您是否知道比这些解决方案更值得信赖的更可靠的库?
本地化是一个复杂的过程。有 200 多种语言和 500 多种区域变体。虽然这已经成为一项艰巨的学术任务,但还要加上政治问题和政府指令。描述什么在语言和文化上是合适的是一项艰巨的任务。即便如此,随着规范的变化和发展,它们也会随着时间的推移而变化。
增加困难的是在计算中我们有多种来源可以从中获得语言和文化定义。这些来源中的每一个都随着更高版本而变化。
因此,将所有这些加在一起,难怪您会看到跨编程语言和部署平台的不同本地化结果。
本地化定义的一个常见来源是大多数 OS 中可用的标准 C 库。众所周知,供应商对问题的复杂性和细节感到不知所措,并且表现不佳。您应该尽可能避免使用此来源。
在某些平台上,例如 macOS,我们可以找到更高级别的框架,可以更好地处理本地化信息。
最好的跨平台源是 CLDR definition files and the ICU library, both provided by the Unicode Consortium. Later versions of Java now use these by default. Ditto for some database systems such as Postgres and 4D。