C# 如何使用CultureInfo格式化不推荐使用的货币?

C# 如何使用CultureInfo格式化不推荐使用的货币?,c#,format,currency,cultureinfo,C#,Format,Currency,Cultureinfo,在dotnet中,以特定于区域性的方式格式化货币的推荐方法是(据我所知): 这将返回: £1,234.57 不过。这里没有给出具体的货币。因此,如果英国曾经转换为欧元,同样的方法会突然出现如下结果: € 1,234.57 这种情况刚刚发生在拉脱维亚。今年,它转换成了欧元。各种系统包含以拉脱维亚和欧元表示的金额。我需要能够仍然打印和格式化旧货币。我需要确保新的货币也能被处理。这种格式不仅与符号有关,还与位置(前后、有无空格)和本地数字格式(十进制分隔符和千位分隔符)有关 我们数据库中的每个

在dotnet中,以特定于区域性的方式格式化货币的推荐方法是(据我所知):

这将返回:

 £1,234.57
不过。这里没有给出具体的货币。因此,如果英国曾经转换为欧元,同样的方法会突然出现如下结果:

 € 1,234.57
这种情况刚刚发生在拉脱维亚。今年,它转换成了欧元。各种系统包含以拉脱维亚和欧元表示的金额。我需要能够仍然打印和格式化旧货币。我需要确保新的货币也能被处理。这种格式不仅与符号有关,还与位置(前后、有无空格)和本地数字格式(十进制分隔符和千位分隔符)有关

我们数据库中的每个金额都有一种货币(如欧元)和相应的文化(如nl)。欧元金额的格式不同,这取决于它们是来自我们的德国办事处还是荷兰办事处。(它们都使用欧元,但金额格式不同)

  • dotnet是否提供对旧货币的访问
  • 什么是一种经得起未来考验的书写格式金额的方法
现在,我能想到的唯一方法是将区域性数据库复制到我的数据库。

您可以创建一个使用不同货币符号/格式(即将其设置为的不同实例)的自定义(通过一个和修改)

然后根据需要将此
CultureInfo
传递给格式化函数

正如对问题的评论所指出的,.NET(以及通常的Windows)不提供历史数据(类似于时区,但有一个可用的数据库)。在需要的情况下,您需要自己保存足够的数据


请记住,在这样的更改下,货币代码不会重复使用,因此根据金额保留货币代码可以正确设置格式。此外,仅仅因为一个国家以一种方式设定货币金额并不意味着每个人都这样做。25法国法郎在英国是“FF25.00”,但在其他地方是“25FF00”或“FF25,00”。(编辑:我注意到你在问题中谈到了最后一段。)

当然,最简单的方法是不使用特定于地区的货币格式,而是将金额格式化为一个简单的数字,并在其前面或后面加上ISO货币代码。公约

       ------------
Sum:   ATS 1.376,00  (= EUR 100,00)
通常在发票上可以找到(例如使用locale
de AT

如果要使用内置的货币格式选项,我建议将货币符号替换为存储在数据库中的货币符号。例如,在
货币表中,您需要将货币映射到符号:

EUR -> €
ATS -> S
...

然后用数据库中的替换。通过这种方式,您可以确保显示的值不会使用错误的货币符号。

如果您的目标是Windows 8或更高版本,此缺陷将由解决方案解决。它要求您提供明确的货币,也可以明确提供语言。

AFAIK.NET不提供您可以使用的传统文化,但它似乎足够简单:您的应用程序需要提供表示新旧制度的
CultureInfo
对象,并在其中进行适当选择。在处理货币交易时,依靠.NET做正确的事情不是一种选择。@Jon:我想是的。我需要在数据库中存储每种使用过的货币的CultureInfo(一份副本),以便在世界发生变化时继续使用它。是的。它的工作原理也是相反的:例如,拉脱维亚在当地时间明天00:00转换为欧元,但.NET不会神奇地在同一时刻在用户的机器上得到更新。你需要在准备时更新你的应用程序。保持.NET Framework版本的更新。我还需要存储货币符号位置(之前/之后,带/不带空格)和小数位数。因此,我选择在我的货币表中存储完整的NumberFormatIF数据。@realbart我假设您的货币表按货币和区域设置(后者是用户的区域设置)存储:欧元金额(例如)在fr和en us中的格式不同(例如,十进制分隔符反映的是客户而不是货币)。如果一个国家有一个特定的标志(如印度现在的标志),这将是最清楚的,但它在其他地方没有被广泛使用(或被认可)。这(取代NumberFormatInfo)是我选择的孤独+图书馆1个;也许我还会为历史货币数据创建一个库。
EUR -> €
ATS -> S
...