如何使用CultureInfo格式化已弃用的货币?

时间:2014-01-08 13:07:28

标签: c# format currency cultureinfo

在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)。欧元金额的格式不同,具体取决于它们来自我们的德国或荷兰办事处。 (他们都使用欧元,但格式不同)

  • dotnet是否提供对旧货币的访问?
  • 编写格式化数量的前瞻性方法是什么?

现在,我能想到的唯一方法就是将文化数据库复制到我的数据库中。

3 个答案:

答案 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会解决此问题。它要求您提供显式货币,您还可以明确提供语言。