javascript - 有没有办法在基于地区设置货币时获得一致的输出
问题描述
我们正在根据区域设置格式化数值,但我们发现当我们用不同的编程语言生成输出时,生成的输出是不同的。而且我也不确定哪个输出是正确的。
在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 лв.
如您所见,千位分隔符以及货币符号的位置不同。有没有一种方法可以解决这种差异,或者您是否知道更可靠的库可能应该比这些解决方案更受信任?
解决方案
本地化是一个复杂的过程。有超过 200 种语言,超过 500 种地区变体。虽然这已经是一项艰巨的学术任务,但还要加上政治问题和政府指令。划定在语言和文化上适当的内容是一项艰巨的任务。即便如此,随着规范的变化和演变,它们也会随着时间而变化。
增加这个困难的事实是,在计算中,我们有多个来源可以从中获取语言和文化定义。并且这些来源中的每一个都会随着更高版本而变化。
因此,将所有这些加在一起,难怪您会看到跨编程语言和部署平台的不同本地化结果。
本地化定义的一个常见来源来自大多数操作系统中可用的标准 C 库。众所周知,供应商对问题的复杂性和细节感到不知所措,并且表现不佳。您应该尽可能避免使用此来源。
在某些平台上,例如 macOS,我们可以找到更高级别的框架,更好地处理本地化信息。
最好的跨平台源代码是CLDR定义文件和ICU库,两者均由 Unicode Consortium 提供。Java 的更高版本现在默认使用这些。某些数据库系统如Postgres和4D也是如此。
推荐阅读
- html - 如何正确居中这些 div?
- r - 从开始时间的密度来看正在进行的事件的密度
- blogger - Blogger Contempo 主题:我想删除所有帖子的描述。调整图像大小,如 CONTEMPO 主题中的特色博客图像
- python - 如何将硒python文件转换为exe?
- android - 即使在 gradle 中添加依赖项后,“无法解析类 android.support.v4.widget.DrawerLayout”
- ios - 快速请求正文为空
- node.js - 使用mongodart包制作应用程序和flutter中的rest api有什么区别
- javascript - Angular NgRx Effect concatMap 基于条件的多个 HTTP 请求
- python - 如何在python中动态创建return语句
- laravel - Laravel 设置带有今天日期的模型表名称