3 Digit currency code to currency symbol

前端 未结 9 1175
逝去的感伤
逝去的感伤 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<string, string> SymbolsByCode;
    
        public static string GetSymbol(string code) { return SymbolsByCode[code]; }
    
        static CurrencyCodeMapper()
        {
            SymbolsByCode = new Dictionary<string, string>();
    
            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.

    0 讨论(0)
  • 2020-12-04 10:44

    This will not work on Windows Phone applications as CultureInfo.GetCultures is not available on the platform (at least not yet). So here is a quick and dirty solution - made with the help of spender's answer containing all the culture codes and currencies at the date.

    public static class CurrencyHelper
    {
        public static string GetCurrencySymbol(string code)
        {
            if (Currencies.ContainsKey(code))
            {
                return Currencies[code];
            }
            else
            {
                return code;
            }
        }
    
        public static Dictionary<string, string> Currencies = new Dictionary<string, string>() {
                                                        {"AED", "د.إ.‏"},
                                                        {"AFN", "؋ "},
                                                        {"ALL", "Lek"},
                                                        {"AMD", "դր."},
                                                        {"ARS", "$"},
                                                        {"AUD", "$"}, 
                                                        {"AZN", "man."}, 
                                                        {"BAM", "KM"}, 
                                                        {"BDT", "৳"}, 
                                                        {"BGN", "лв."}, 
                                                        {"BHD", "د.ب.‏ "},
                                                        {"BND", "$"}, 
                                                        {"BOB", "$b"}, 
                                                        {"BRL", "R$"}, 
                                                        {"BYR", "р."}, 
                                                        {"BZD", "BZ$"}, 
                                                        {"CAD", "$"}, 
                                                        {"CHF", "fr."}, 
                                                        {"CLP", "$"}, 
                                                        {"CNY", "¥"}, 
                                                        {"COP", "$"}, 
                                                        {"CRC", "₡"}, 
                                                        {"CSD", "Din."}, 
                                                        {"CZK", "Kč"}, 
                                                        {"DKK", "kr."}, 
                                                        {"DOP", "RD$"}, 
                                                        {"DZD", "DZD"}, 
                                                        {"EEK", "kr"}, 
                                                        {"EGP", "ج.م.‏ "},
                                                        {"ETB", "ETB"}, 
                                                        {"EUR", "€"}, 
                                                        {"GBP", "£"}, 
                                                        {"GEL", "Lari"}, 
                                                        {"GTQ", "Q"}, 
                                                        {"HKD", "HK$"}, 
                                                        {"HNL", "L."}, 
                                                        {"HRK", "kn"}, 
                                                        {"HUF", "Ft"}, 
                                                        {"IDR", "Rp"}, 
                                                        {"ILS", "₪"}, 
                                                        {"INR", "रु"}, 
                                                        {"IQD", "د.ع.‏ "},
                                                        {"IRR", "ريال "},
                                                        {"ISK", "kr."}, 
                                                        {"JMD", "J$"}, 
                                                        {"JOD", "د.ا.‏ "},
                                                        {"JPY", "¥"}, 
                                                        {"KES", "S"}, 
                                                        {"KGS", "сом"}, 
                                                        {"KHR", "៛"}, 
                                                        {"KRW", "₩"}, 
                                                        {"KWD", "د.ك.‏ "},
                                                        {"KZT", "Т"}, 
                                                        {"LAK", "₭"}, 
                                                        {"LBP", "ل.ل.‏ "},
                                                        {"LKR", "රු."}, 
                                                        {"LTL", "Lt"}, 
                                                        {"LVL", "Ls"}, 
                                                        {"LYD", "د.ل.‏ "},
                                                        {"MAD", "د.م.‏ "},
                                                        {"MKD", "ден."}, 
                                                        {"MNT", "₮"}, 
                                                        {"MOP", "MOP"}, 
                                                        {"MVR", "ރ."}, 
                                                        {"MXN", "$"}, 
                                                        {"MYR", "RM"}, 
                                                        {"NIO", "N"}, 
                                                        {"NOK", "kr"}, 
                                                        {"NPR", "रु"}, 
                                                        {"NZD", "$"}, 
                                                        {"OMR", "ر.ع.‏ "},
                                                        {"PAB", "B/."}, 
                                                        {"PEN", "S/."}, 
                                                        {"PHP", "PhP"}, 
                                                        {"PKR", "Rs"}, 
                                                        {"PLN", "zł"}, 
                                                        {"PYG", "Gs"}, 
                                                        {"QAR", "ر.ق.‏ "},
                                                        {"RON", "lei"}, 
                                                        {"RSD", "Din."}, 
                                                        {"RUB", "р."}, 
                                                        {"RWF", "RWF"}, 
                                                        {"SAR", "ر.س.‏ "},
                                                        {"SEK", "kr"}, 
                                                        {"SGD", "$"}, 
                                                        {"SYP", "ل.س.‏ "},
                                                        {"THB", "฿"}, 
                                                        {"TJS", "т.р."}, 
                                                        {"TMT", "m."}, 
                                                        {"TND", "د.ت.‏ "},
                                                        {"TRY", "TL"}, 
                                                        {"TTD", "TT$"}, 
                                                        {"TWD", "NT$"}, 
                                                        {"UAH", "₴"}, 
                                                        {"USD", "$"}, 
                                                        {"UYU", "$U"}, 
                                                        {"UZS", "so'm"}, 
                                                        {"VEF", "Bs. F."}, 
                                                        {"VND", "₫"}, 
                                                        {"XOF", "XOF"}, 
                                                        {"YER", "ر.ي.‏ "},
                                                        {"ZAR", "R"}, 
                                                        {"ZWL", "Z$"} };
    }
    
    0 讨论(0)
  • 2020-12-04 10:51

    While a bit brute-force and not particularly elegant, you could do it like this:

    public bool TryGetCurrencySymbol(string ISOCurrencySymbol, out string symbol)
    {
        symbol = CultureInfo
            .GetCultures(CultureTypes.AllCultures)
            .Where(c => !c.IsNeutralCulture)
            .Select(culture => {
                try{
                    return new RegionInfo(culture.Name);
                }
                catch
                {
                    return null;
                }
            })
            .Where(ri => ri!=null && ri.ISOCurrencySymbol == ISOCurrencySymbol)
            .Select(ri => ri.CurrencySymbol)
            .FirstOrDefault();
        return symbol != null;
    }
    

    and use it as follows:

    string currSymbol;
    if(TryGetCurrencySymbol("GBP",out currSymbol))
    {
        Console.WriteLine("symbol is {0}", currSymbol);
    }
    

    If you anticipate hammering this method, perhaps it's better to build a cache up front:

    public static class CurrencyTools
    {
        private static IDictionary<string,string> map;
        static CurrencyTools()
        {
            map = CultureInfo
                .GetCultures(CultureTypes.AllCultures)
                .Where(c => !c.IsNeutralCulture)
                .Select(culture => {
                    try{
                        return new RegionInfo(culture.Name);
                    }
                    catch
                    {
                        return null;
                    }
                })
                .Where(ri => ri!=null)
                .GroupBy(ri => ri.ISOCurrencySymbol)
                .ToDictionary(x => x.Key, x => x.First().CurrencySymbol);
        }
        public static bool TryGetCurrencySymbol(
                              string ISOCurrencySymbol, 
                              out string symbol)
        {
            return map.TryGetValue(ISOCurrencySymbol,out symbol);
        }
    }
    

    At the time of writing, on my machine etc. etc. the map contains the following mappings:

    AED  د.إ.‏
    AFN  ؋
    ALL  Lekë
    AMD  ֏
    ANG  NAf.
    AOA  Kz
    ARS  $
    AUD  $
    AWG  Afl.
    AZN  ₼
    BAM  КМ
    BBD  $
    BDT  ৳
    BGN  лв.
    BHD  د.ب.‏
    BIF  FBu
    BMD  $
    BND  $
    BOB  Bs
    BRL  R$
    BSD  $
    BTN  Nu.
    BWP  P
    BYN  Br
    BZD  $
    CAD  $
    CDF  FC
    CHF  CHF
    CLP  $
    CNY  ¥
    COP  $
    CRC  ₡
    CUP  $
    CVE  ​
    CZK  Kč
    DJF  Fdj
    DKK  kr.
    DOP  $
    DZD  د.ج.‏
    EGP  ج.م.‏
    ERN  Nfk
    ETB  Br
    EUR  €
    FJD  $
    FKP  £
    GBP  £
    GEL  ₾
    GHS  GH₵
    GIP  £
    GMD  D
    GNF  FG
    GTQ  Q
    GYD  $
    HKD  $
    HNL  L
    HRK  kn
    HTG  G
    HUF  Ft
    IDR  Rp
    ILS  ₪
    INR  ₹
    IQD  د.ع.‏
    IRR  ريال
    ISK  kr
    JMD  $
    JOD  د.ا.‏
    JPY  ¥
    KES  Ksh
    KGS  сом
    KHR  ៛
    KMF  CF
    KPW  ₩
    KRW  ₩
    KWD  د.ك.‏
    KYD  $
    KZT  ₸
    LAK  ₭
    LBP  ل.ل.‏
    LKR  රු.
    LRD  $
    LYD  د.ل.‏
    MAD  د.م.‏
    MDL  L
    MGA  Ar
    MKD  ден
    MMK  K
    MNT  ₮
    MOP  MOP$
    MRU  MRU
    MUR  Rs
    MVR  ރ.
    MWK  MK
    MXN  $
    MYR  RM
    MZN  MTn
    NAD  $
    NGN  ₦
    NIO  C$
    NOK  kr
    NPR  रु
    NZD  $
    OMR  ر.ع.‏
    PAB  B/.
    PEN  S/
    PGK  K
    PHP  ₱
    PKR  Rs
    PLN  zł
    PYG  ₲
    QAR  ر.ق.‏
    RON  lei
    RSD  дин.
    RUB  ₽
    RWF  RF
    SAR  ر.س.‏
    SBD  $
    SCR  SR
    SDG  ج.س.
    SEK  kr
    SGD  $
    SHP  £
    SLL  Le
    SOS  S
    SRD  $
    SSP  £
    STN  Db
    SYP  ل.س.‏
    SZL  E
    THB  ฿
    TJS  смн
    TMT  m.
    TND  د.ت.‏
    TOP  T$
    TRY  ₺
    TTD  $
    TWD  NT$
    TZS  TSh
    UAH  ₴
    UGX  USh
    USD  $
    UYU  $
    UZS  сўм
    VES  Bs.S
    VND  ₫
    VUV  VT
    WST  WS$
    XAF  FCFA
    XCD  EC$
    XDR  XDR
    XOF  CFA
    XPF  FCFP
    YER  ر.ي.‏
    ZAR  R
    ZMW  K
    
    0 讨论(0)
  • 2020-12-04 10:53

    This is how I have been getting the DECLARE @CultureCode varchar(10) = 'en-us'

    SELECT SUBSTRING(FORMAT(CONVERT(money,0), 'C', @CultureCode ),1,1) CurrencySymbol

    0 讨论(0)
  • 2020-12-04 10:54

    The RegionInfo class has a CurrencySymbol property, so it's doable in C#. You could perhaps use a C# stored procedure if you wanted to do it in Sql Server.

    RegionInfo regionInfo = new RegionInfo("GB");
    Console.WriteLine(regionInfo.CurrencySymbol); // £
    

    (You need to use the ISO country codes)

    0 讨论(0)
  • 2020-12-04 10:55

    This answer puts @spender's code, with a minor tweak, in a utility class that attempts to convert three-letter ISO currency codes to their presently-circulating symbols. For efficiency, this class uses an internal cache of all previous requests, also suggested by @spender.

    public static class CurrencySymbolMapper {
        /// <summary>An internal cache of previously looked up currencies.</summary>
        private static Dictionary<string, string> _currencySymbolsCache =
            new Dictionary<string, string> (StringComparer.CurrentCultureIgnoreCase);
    
        public static string TryGetCurrencySymbol(string threeLetterISOAlphabeticCode) {
            // TODO: Enhance to get rid of the silent exception that gets thrown when constructing a new RegionInfo(CultureInfo.LCID) temporary object
    
            if (threeLetterISOAlphabeticCode.Length != 3) return string.Empty;
            if (_currencySymbolsCache.ContainsKey(threeLetterISOAlphabeticCode))
                return _currencySymbolsCache[threeLetterISOAlphabeticCode];
    
            string currencySymbolSearchResult = string.Empty;
            try {
                currencySymbolSearchResult =
                    CultureInfo.GetCultures(CultureTypes.AllCultures)
                                .Where(c => !c.IsNeutralCulture)
                                .Select(culture => {
                                    try { return new RegionInfo(culture.LCID); }
                                    catch { return null; } // Ignore this error, but enhance future implementation to get ride of this silent exception
                                })
                                .Where(ri => ri != null && string.Equals(ri.ISOCurrencySymbol, threeLetterISOAlphabeticCode, StringComparison.OrdinalIgnoreCase))
                                .Select(ri => ri.CurrencySymbol)
                                .FirstOrDefault();
            }
            catch (Exception e) {
                // TODO: Handle error
            }
    
            if (currencySymbolSearchResult == null) currencySymbolSearchResult = string.Empty;
    
            // Saves both valid and invalid search results, just in case users hammer this method with 
            // the same invalid request many times
            _currencySymbolsCache.Add(threeLetterISOAlphabeticCode, currencySymbolSearchResult);
            return currencySymbolSearchResult;
        }
    }
    
    0 讨论(0)
提交回复
热议问题