在dotnet中,以文化特定方式格式化货币的推荐方法是(据我所知):
using System.Globalization
var info = CultureInfo.GetCultureInfo("en-GB")
return string.Format(info, "{0:c}", 1234.5678)
返回:
£1,234.57
然而。此处未给出具体货币。因此,如果英国皈依欧元,同样的方法会突然回归:
€ 1,234.57
这恰好发生在拉脱维亚。今年,它转换为欧元。各种系统包含letvia lats和euros两种金额。我需要能够打印和格式化旧货币。我需要确保新货币也可以处理。此格式不仅与符号有关,还与放置(前后,有或没有空格)和本地数字格式(小数分隔符和千位分隔符)有关。
我们数据库中的每个金额都有货币(例如EUR)和相应的文化(例如nl-NL)。欧元金额的格式不同,具体取决于它们来自我们的德国或荷兰办事处。 (他们都使用欧元,但格式不同)
现在,我能想到的唯一方法就是将文化数据库复制到我的数据库中。
答案 0 :(得分:1)
您可以创建使用不同货币符号/格式的自定义CultureInfo
(按cloning进行修改)(即将其NumberFormat
设置为{{3}的不同实例}})。
然后根据需要将此CultureInfo
传递给格式化函数。
正如对问题的评论所述,.NET(以及一般的Windows)不提供历史数据(类似于时区,但有NumberFormatInfo
)。在您需要的情况下,您需要自己保留足够的数据。
请记住library for that货币代码在此类更改下不会被重复使用,因此保留货币代码可以使您正确格式化。另外,仅仅因为一个国家以一种方式格式化其货币数量并不意味例如。 25法国法郎在英国是“FF25.00”,在其他地方是“25FF00”或“FF25,00”。 (编辑:我注意到你在这个问题的最后一段。)
答案 1 :(得分:1)
当然,最简单的方法是不使用特定于语言环境的货币格式,而是将金额格式化为简单的数字,并使用ISO货币代码预先或后缀。惯例
------------
Sum: ATS 1.376,00 (= EUR 100,00)
常见于发票上(以区域设置de-AT
为例)。
如果您想使用内置货币格式选项,我建议将货币符号替换为存储在数据库中的货币符号。即,在您的currency
表中,您需要将货币映射到符号:
EUR -> €
ATS -> S
...
然后你用数据库中的那个替换myCultureInfo.NumberFormat.CurrencySymbol
。这样,您可以确保永远不会使用错误的货币符号显示值。
答案 2 :(得分:0)
如果您的目标是Windows 8或更高版本,Windows.Globalization.NumberFormatting.CurrencyFormatter会解决此问题。它要求您提供显式货币,您还可以明确提供语言。