2012-09-11 5 views
35

In C# ist es möglich, ein Währungssymbol wie '£' aus dem 3-stelligen Währungscode, in diesem Fall 'GBP', zu erhalten?3-stelliger Währungscode zu Währungssymbol

Ist dies entweder in SQL Server oder in C# möglich?

+1

können Sie immer Ihre eigene Methode –

+1

schreiben, aber dann brauche ich eine Zuordnung für alle Währungen zu schaffen, in die Welt. –

+0

Mit 'RegionInfo' können Sie den ISO 2-Zeichencode verwenden. – Oded

Antwort

59

Während ein bisschen Brute-Force und nicht besonders elegant, können Sie es wie folgt tun:

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

und es verwenden, wie folgt:

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

Wenn Sie diese Methode antizipieren Hämmern, vielleicht es ist besser, einen Cache im Vordergrund zu bauen:

Zum Zeitpunkt des Schreibens, auf meinem m achine usw. etc. die karte enthält die folgenden mappings:

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

Sie codieren gut @spender. –

+0

@spender Brillante Antwort !! ! – user1799214

+1

@spender, ich habe Ihren Ansatz und entfernt try/catch-Block mit Filterung nur bestimmte Kulturtypen Cultureculture = CultureInfo.GetCultures (CultureTypes.InstalledWin32Cultures | CultureTypes.SpecificCultures) verwendet .FirstOrDefault (c => c.IsNeutralCulture && ! c.Equals (CultureInfo.InvariantCulture) && neue RegionInfo (c.LCID) .ISOCurrencySymbol == _currency.IsoLetterCode)? CultureInfo.CurrentCulture; –

6

Die Klasse RegionInfo hat eine CurrencySymbol property, also ist es in C# machbar. Sie könnten vielleicht eine gespeicherte C# -Prozedur verwenden, wenn Sie dies in SQL Server tun wollten.

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

(Sie müssen die ISO country codes verwenden)

+1

Die RegionInfo-Klasse hat auch ISOCurrencySymbol, das den aus drei Buchstaben bestehenden Code darstellt. Das wäre also auch mein Vorschlag. Der Trick besteht darin, die Region mit einem bestimmten ISO-Währungscode effizient aus den verfügbaren Regionen zu erhalten. – KeithS

32

.NET CultureInfo.NumberFormat.CurrencySymbol

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

Aber dies erfordert die Kulturnamen, nicht "GBP". Soweit ich es nicht möglich wissen, direkt aus "GBP" usw.

Die gleichen Informationen sind auch über RegionInfo zur Verfügung, zusammen mit dem Währungscode:

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 

Ich nehme an eine denkbar, dass verwenden könnte ein konstruieren Karte von ISO-Code zu Symbol.

Die Liste der Kulturnamen ist verfügbar here.

EDIT: Nun, das scheint zu funktionieren:

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

Verbrauch:

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

Hinweis, natürlich, dass dies nicht eine umfassende Liste zu erzeugen. Insbesondere werden alte Währungen der Eurozone, die durch den Euro ersetzt wurden, nicht berücksichtigt. Ich kann nichts sehen, aber manuell solche Währungen hinzufügen, wenn Sie sie brauchen, zum Beispiel SymbolsByCode.Add("FRF", "₣"); für French Francs.

+0

Dies ist bei weitem die eleganteste Antwort auf dieser Seite! Das Caching beim Aufbau macht es viel schneller als alle anderen Lösungen, die mehrere Suchvorgänge erfordern. – Ian

+1

Beste Antwort (nach dem Abschnitt Bearbeiten)! Danke, Verdesmarald! – Hajjat

3

Versuchen Sie diesen Code. Geben Sie 'USD' als CurrencyCode und alle anderen ein.

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

arbeitet Dies wird nicht auf Anwendungen Windows Phone als CultureInfo.GetCultures auf der Plattform nicht verfügbar ist (zumindest noch nicht). Also hier ist eine schnelle und schmutzige Lösung - mit Hilfe von Spender Antwort gemacht, die alle Kultur Codes und Währungen zum Zeitpunkt enthält.

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

Diese Antwort stellt Code des @ spender, mit einer kleinen zwicken, in einer Utility-Klasse, die aus drei Buchstaben bestehenden ISO-Währungscodes auf ihre gegenwärtig zirkulierenden Symbole zu konvertieren versucht. Aus Effizienzgründen verwendet diese Klasse einen internen Cache aller früheren Anfragen, die auch von @spender vorgeschlagen werden.

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

Mit Hilfe dieses Threads habe ich eine Verlängerung kurzen String-Methode

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