2012-09-11 100 views
35

在C#中,有可能從3個字符的貨幣代碼中獲得貨幣符號,例如'£',在這種情況下爲'GBP'?3位貨幣代碼到貨幣符號

這可能在SQL Server或C#中?

+1

你總是可以編寫自己的方法 –

+1

但後來我需要創建一個映射在所有的貨幣世界。 –

+0

使用'RegionInfo'您可以使用ISO 2字符代碼。 – Oded

回答

59

雖然有點蠻力,而不是特別優雅,你可以做這樣的:

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

和按如下方式使用它:

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

如果您預計錘擊這種方法,也許最好先建立一個緩存:

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

在撰寫本文時,我的m achine等等。該地圖包含以下映射:

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

你代碼很好@spender。 –

+0

@spender輝煌的答覆! – user1799214

+1

@spender,我用你的方法,並使用過濾只有特定的文化類型刪除try/catch塊 的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

RegionInfo類有一個CurrencySymbol property,所以它在C#中是可行的。如果你想在Sql Server中做,你可以使用C#存儲過程。

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

(您需要使用ISO country codes

+1

RegionInfo類也有三字母代碼的ISOCurrencySymbol。所以這也是我的建議。訣竅是有效地從可用區域獲取具有特定ISO貨幣代碼的區域。 – KeithS

32

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

但是這需要文化名稱,而不是"GBP"。據我知道它不可能直接從"GBP"

相同的信息也可通過RegionInfo提供,貨幣代碼一起:

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 

我想一個可以想見,用它來構建從ISO代碼映射到符號。

文化名稱列表是可用here

編輯:嗯,這似乎工作:

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

用法:

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

注意,當然,這不會產生一個完整列表。特別是,它不包括被歐元取代的舊歐元區貨幣。我無法看到任何解決方法,但是如果您需要,可以手動添加這些貨幣,例如法語法郎爲SymbolsByCode.Add("FRF", "₣");

+0

這是迄今爲止本頁上最優雅的答案!構建緩存將使其比所有需要多次查找的其他解決方案快得多。 – Ian

+1

最佳答案(在編輯部分之後)!謝謝,verdesmarald! – Hajjat

3

嘗試此代碼。輸入'USD'作爲CurrencyCode和所有其他。

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

CultureInfo.GetCultures不可用的平臺上(至少目前還沒有),這將不會在Windows Phone應用程序。所以這裏是一個快速和骯髒的解決方案 - 在包含當日所有文化代碼和貨幣的支票答案的幫助下完成的。

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

這個回答把@花費者的代碼,有小調整,以嘗試三個字母ISO貨幣代碼轉換成他們目前流通符號的實用工具類。爲了提高效率,該類使用所有先前請求的內部緩存,也由@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

有了這個線索的幫助下,我做了一個簡短的字符串擴展方法

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