2012-09-11 21 views
35

In C# è possibile ottenere un simbolo di valuta, come "£", dal codice di valuta di 3 caratteri, in questo caso "GBP"?3 Digita il codice valuta nel simbolo di valuta

Ciò è possibile sia in SQL Server che in C#?

+1

si può sempre scrivere il proprio metodo di –

+1

Ma poi ho bisogno di creare una mappatura di tutte le valute in il mondo. –

+0

Utilizzando 'RegionInfo' è possibile utilizzare il codice carattere ISO 2. – Oded

risposta

59

Mentre un po 'di forza bruta e non particolarmente elegante, si potrebbe fare in questo modo:

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

e usarlo come segue:

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

Se si prevede martellare questo metodo, forse è meglio costruire una cache in primo piano:

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.LCID); 
       } 
       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); 
    } 
} 

Al momento della scrittura, sul mio m ecc. ecc. la mappa contiene i seguenti mapping:

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$ 
+1

Codice bene @spender. –

+0

@spender Risposta brillante !! – user1799214

+1

@spender, ho usato il tuo approccio e rimosso blocco try/catch utilizzando filtraggio solo i tipi di cultura specifica CultureInfo CultureInfo = CultureInfo.GetCultures (CultureTypes.InstalledWin32Cultures | CultureTypes.SpecificCultures)! .FirstOrDefault (c => c.IsNeutralCulture && ! c.Equals (CultureInfo.InvariantCulture) && new RegionInfo (c.LCID) .ISOCurrencySymbol == _currency.IsoLetterCode) ?? CultureInfo.CurrentCulture; –

6

La classe RegionInfo ha un CurrencySymbol property, quindi è fattibile in C#. Potresti forse usare una procedura memorizzata C# se vuoi farlo in SQL Server.

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

(è necessario utilizzare il ISO country codes)

+1

La classe RegionInfo ha anche ISOCurrencySymbol, che è il codice a tre lettere. Quindi questo sarebbe il mio suggerimento. Il trucco sta nell'ottenere efficientemente la regione con un particolare codice di valuta ISO dalle regioni disponibili. – KeithS

32

.NET ha 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); // € 

ma questo richiede il nome della cultura, non "GBP". Per quanto ne so la sua non è possibile direttamente dal "GBP", ecc

Le stesse informazioni sono disponibili tramite RegionInfo anche, insieme al codice di valuta:

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 

Suppongo che si potrebbe in teoria usare che per costruire un mappa dal codice ISO al simbolo.

L'elenco dei nomi di colture è disponibile here.

EDIT: Beh questo sembra funzionare:

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") // € 

nota, naturalmente, che questo non produrre un elenco completo. In particolare, non include le vecchie monete dell'eurozona che sono state sostituite dall'euro. Non riesco a vedere in alcun modo intorno a questo, ma per aggiungere manualmente tali valute se ne avete bisogno, ad esempio SymbolsByCode.Add("FRF", "₣"); per franchi francesi.

+0

Questa è di gran lunga la risposta più elegante su questa pagina! Il caching sulla costruzione renderà molto più veloce di tutte le altre soluzioni che richiedono più ricerche. – Ian

+1

Risposta migliore (dopo la sezione Modifica)! Grazie, verdesmarald! – Hajjat

3

Prova questo codice. Inserisci "USD" come CurrencyCode e tutti gli altri.

public string getCurrencySymbol(string CurrencyCode)  
{ 
     string symbol = string.Empty; 
     CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures); 
     IList Result = new ArrayList(); 
     foreach (CultureInfo ci in cultures) 
     { 
      RegionInfo ri = new RegionInfo(ci.LCID); 
      if (ri.ISOCurrencySymbol == CurrencyCode) 
      { 
       symbol = ri.CurrencySymbol; 
       return symbol; 
      } 
     } 
     return symbol; 

    } 
6

Questo non funziona su applicazioni Windows Phone come CultureInfo.GetCultures non è (almeno non ancora) disponibili sulla piattaforma. Quindi ecco una soluzione rapida e sporca - realizzata con l'aiuto della risposta di spender contenente tutti i codici cultura e le valute alla data.

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

Questa risposta mette codice @ di Spender, con un tweak minore, in una classe di utilità che tenta di convertire tre lettere codici di valuta ISO per i loro simboli attualmente-circolanti. Per efficienza, questa classe utilizza una cache interna di tutte le richieste precedenti, suggerita anche da @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
public static string GetCurrencySymbol(string code) 
{ 
System.Globalization.RegionInfo regionInfo = (from culture in System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.InstalledWin32Cultures) 
       where culture.Name.Length > 0 && !culture.IsNeutralCulture 
       let region = new System.Globalization.RegionInfo(culture.LCID) 
       where String.Equals(region.ISOCurrencySymbol, code, StringComparison.InvariantCultureIgnoreCase) 
       select region).First(); 

return regionInfo.CurrencySymbol; 
} 
0

Con l'aiuto di questa discussione ho fatto un metodo di estensione breve stringa

public static string ToCurrencySymbol(this string ISOCurrency) 
{    
    RegionInfo region = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(x => new RegionInfo(x.LCID)).FirstOrDefault(p => p.ISOCurrencySymbol == ISOCurrency); 
    return region?.ISOCurrencySymbol ?? ISOCurrency; 
} 
Problemi correlati