2012-09-11 30 views
35

En C# ¿es posible obtener un símbolo de moneda, como '£', del código de moneda de 3 caracteres, en este caso 'GBP'?Código de moneda de 3 dígitos al símbolo de moneda

¿Es esto posible en SQL Server o en C#?

+1

siempre se puede escribir su propio método –

+1

Pero entonces tengo que crear una asignación para todas las monedas en el mundo. –

+0

Usando 'RegionInfo' puede usar el código de carácter ISO 2. – Oded

Respuesta

59

Mientras que un poco de fuerza bruta y no particularmente elegante, que podrían hacerlo de esta manera:

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; 
} 

y utilizarlo como sigue:

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

si prevé martilleo este método, tal vez es mejor construir un caché por adelantado:

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 de escribir, en mi m achine etc. etc. el mapa contiene las siguientes asignaciones:

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

Codifica bien @spender. –

+0

@spender Brilliant reply !! – user1799214

+1

@spender, he utilizado su enfoque y eliminado bloque try/catch mediante filtración únicos tipos de cultivo específicos 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 clase RegionInfo tiene un CurrencySymbol property, por lo que es factible en C#. Tal vez podrías usar un procedimiento almacenado en C# si quisieras hacerlo en el servidor Sql.

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

(Es necesario utilizar el ISO country codes) .NET

+1

La clase RegionInfo también tiene ISOCurrencySymbol, que es el código de tres letras. Así que esta sería mi sugerencia también. El truco es lograr que la región tenga un código de moneda ISO particular de las regiones disponibles. – KeithS

32

tiene 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); // € 

Pero esto requiere que el nombre de la cultura, no "GBP". Por lo que yo se que no es posible directamente desde "GBP", etc.

La misma información también está disponible a través de RegionInfo, junto con el código de moneda:

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 

supongo que se podría utilizar concebible que para construir una mapa de código ISO a símbolo.

La lista de nombres de cultura está disponible here.

EDIT: bien esto parece funcionar:

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

Uso:

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

Tenga en cuenta, por supuesto, que esto no se producirá una lista completa. En particular, no incluye monedas antiguas de la zona euro que han sido reemplazadas por el euro. No veo ninguna forma de evitar esto, sino agregar manualmente esas monedas si las necesita, por ejemplo, SymbolsByCode.Add("FRF", "₣"); para los francos franceses.

+0

¡Esta es la respuesta más elegante en esta página! El almacenamiento en caché al momento de la construcción lo hará mucho más rápido que todas las otras soluciones que requieren búsquedas múltiples. – Ian

+1

¡Mejor respuesta (después de la sección de Edición)! Gracias, verdemarald! – Hajjat

3

Pruebe este código. Ingrese 'USD' como CurrencyCode y todo lo demás.

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

Esto no va a trabajar en aplicaciones de Windows Phone como CultureInfo.GetCultures no está disponible en la plataforma (al menos por ahora). Así que aquí hay una solución rápida y sucia, hecha con la ayuda de la respuesta del inversionista que contiene todos los códigos de cultura y monedas en la fecha.

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

Esta respuesta pone de código @ de Spender, con un pequeño ajuste, en una clase de utilidad que intenta convertir de tres letras códigos de moneda ISO en sus símbolos en la actualidad-circulantes. Para mayor eficiencia, esta clase usa un caché interno de todas las solicitudes anteriores, también sugerido por @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 la ayuda de este hilo hice un método de extensión corta cadena

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; 
} 
Cuestiones relacionadas