【问题标题】:C# formatting currency given currency code (like USD / GBP / FRF)给定货币代码的 C# 格式化货币(如 USD / GBP / FRF)
【发布时间】:2011-06-27 18:03:12
【问题描述】:

我正在与一个返回货币 (System.Decimal) 和货币代码的数据库集成。货币代码是"USD"、"GBP",甚至"FRF"等字符串。

mscorlib 是否有内置功能可以帮助我格式化这些货币?我首先想到的是在数据库货币代码和CultureInfo 之间建立一个映射,但我不知道如何处理 FRF,因为如果我使用"fr-FR",它会格式化为欧元而不是法郎。

我们必须支持的货币符号的完整列表是:

FRF
CHF
NZD
IN2
SAR
SEK
EUR
MXP
DKK
GBP
AUD
IN1
AED
CAD
NOK
INR
USD
PLN

【问题讨论】:

    标签: c# formatting globalization currency


    【解决方案1】:

    我首先考虑在数据库货币代码和 CultureInfo 之间建立一个映射,但我不知道如何处理 FRF,因为如果我使用“fr-FR”,它将格式化为欧元而不是法郎。

    我会采用这种方法,但为 FRF 制作一个自定义的 IFormatProvider,以执行您选择的格式。这就像正确构造 NumberFormatInfo 一样简单。

    【讨论】:

    • 我认为它们都需要定制。数据库记录中的货币与特定时间点的文化相关,而new CultureInfo(...) 仅代表“现在”。因此,依赖 any 内置文化可能意味着货币符号会因 Windows 更新而意外更改。这听起来对吗?
    • @tenfour:取决于你在这里尝试做什么。如果您希望它是可更新的,那么它们不必是自定义的。如果您想修复此问题,则可以使用所有自定义版本。不过,生成 NumberFormatInfo 非常容易,因此,如果您想要完全控制,在字典中制作一组自定义的将需要几个小时的工作,顶...
    【解决方案2】:

    您可以replace the default currency 并仍然使用该框架...

    using System;
    using System.Globalization;
    using System.Threading;
    public class EuroLocalSample
    {
       public static void Main()
       { 
         // Create a CultureInfo object for French in France.
         CultureInfo FrCulture = new CultureInfo("fr-FR");
         // Set the CurrentCulture to fr-FR.
         Thread.CurrentThread.CurrentCulture = FrCulture;
        // Clone the NumberFormatInfo object and create
        // a new object for the local currency of France.
        NumberFormatInfo LocalFormat =
        (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
        // Replace the default currency symbol with the local
        // currency symbol.
        LocalFormat.CurrencySymbol = "F";
    
        int i = 100;
    
        // Display i formatted as the local currency.
        Console.WriteLine(i.ToString("c", LocalFormat));
        // Display i formatted as the default currency.
        Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo));
       }
    }
    

    【讨论】:

    • 为什么可以安全地假设仅替换货币符号会产生准确的格式?
    • @tenfour 根据文档,我认为虽然欧元在 1999 年成为新货币,但将值格式化为字符串表示形式并没有。因此,显示为欧元或法郎的 100 只会根据尾随货币类型的定义有所不同。
    • 这基本上是我最终做的。但由于我希望NumberFormatInfo 被锁定,Windows 更新不会改变,我基本上只是将现有NumberFormatInfo 对象的映射序列化为XML,并为FRF 等手动编辑XML。现在我们使用这个 XML 来定义格式。
    • 此解决方案不显示货币符号。它仅显示您在 .CurrencySymbol 字段中输入的任何字符串。如果我使用“XYZ”,它只会显示“100 XYZ”,而对于美元,它不会显示“$100”
    【解决方案3】:

    这是一个非常小的列表。我只是手动设置映射。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多