3 Digit currency code to currency symbol

前端 未结 9 1213
逝去的感伤
逝去的感伤 2020-12-04 10:19

In C# is it possible to get a currency symbol, like \'£\', from the 3 character currency code, in this case \'GBP\'?

Is this possible either in SQL Server or in C#?<

9条回答
  •  甜味超标
    2020-12-04 10:36

    .NET has CultureInfo.NumberFormat.CurrencySymbol

    CultureInfo us = new CultureInfo("en-US");
    CultureInfo gb = new CultureInfo("en-GB");
    CultureInfo fr = new CultureInfo("fr-FR");
    
    Console.Out.WriteLine(us.NumberFormat.CurrencySymbol); // $
    Console.Out.WriteLine(gb.NumberFormat.CurrencySymbol); // £
    Console.Out.WriteLine(fr.NumberFormat.CurrencySymbol); // €
    

    But this requires the culture name, not "GBP". As far as I know its not possible directly from "GBP", etc.

    The same information is also available via RegionInfo, along with the currency code:

    RegionInfo us = new RegionInfo("en-US");
    RegionInfo gb = new RegionInfo("en-GB");
    RegionInfo fr = new RegionInfo("fr-FR");
    
    Console.Out.WriteLine(us.CurrencySymbol); // $
    Console.Out.WriteLine(gb.CurrencySymbol); // £
    Console.Out.WriteLine(fr.CurrencySymbol); // €
    
    Console.Out.WriteLine(us.ISOCurrencySymbol); // USD
    Console.Out.WriteLine(gb.ISOCurrencySymbol); // GBP
    Console.Out.WriteLine(fr.ISOCurrencySymbol); // EUR
    

    I suppose one could conceivably use that to construct a map from ISO code to symbol.

    The list of culture names is avaliable here.

    EDIT: Well this seems to work:

    public static class CurrencyCodeMapper
    {
        private static readonly Dictionary SymbolsByCode;
    
        public static string GetSymbol(string code) { return SymbolsByCode[code]; }
    
        static CurrencyCodeMapper()
        {
            SymbolsByCode = new Dictionary();
    
            var regions = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                          .Select(x => new RegionInfo(x.LCID));
    
            foreach (var region in regions)
                if (!SymbolsByCode.ContainsKey(region.ISOCurrencySymbol))
                    SymbolsByCode.Add(region.ISOCurrencySymbol, region.CurrencySymbol);
        }
    }
    

    Usage:

    CurrencyCodeMapper.GetSymbol("USD") // $
    CurrencyCodeMapper.GetSymbol("GBP") // £
    CurrencyCodeMapper.GetSymbol("EUR") // €
    

    Note, of course, that this does not produce a comprehensive list. In particular, it does not include old Eurozone currencies that have been superseded by the Euro. I cannot see any way around this but to manually add such currencies if you need them, for example SymbolsByCode.Add("FRF", "₣"); for French Francs.

提交回复
热议问题