3 位货币代码到货币符号

Posted

技术标签:

【中文标题】3 位货币代码到货币符号【英文标题】:3 Digit currency code to currency symbol 【发布时间】:2012-09-04 14:59:48 【问题描述】:

在 C# 中,是否可以从 3 个字符的货币代码(在本例中为“GBP”)获取货币符号,例如“£”?

这在 SQL Server 或 C# 中是否可行?

【问题讨论】:

您可以随时编写自己的方法 但是我需要为世界上所有的货币创建一个映射。 使用RegionInfo可以使用ISO 2字符代码。 【参考方案1】:

虽然有点蛮力而且不是特别优雅,但您可以这样做:

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;

并按如下方式使用:

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

在撰写本文时,在我的机器等上,地图包含以下映射:

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

【讨论】:

@spender 精彩回复!! @spender,我使用了您的方法,并使用仅过滤特定文化类型来删除 try/catch 块 CultureInfocultureInfo = CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures|CultureTypes.SpecificCultures) .FirstOrDefault(c => ! c.IsNeutralCulture && !c.Equals(CultureInfo.InvariantCulture) && new RegionInfo(c.LCID).ISOCurrencySymbol == _currency.IsoLetterCode) ??CultureInfo.CurrentCulture; .Select 可以简化而不会抛出异常: .Select(culture => string.IsNullOrWhiteSpace(culture.Name) ? null : new RegionInfo(culture.Name))【参考方案2】:

.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", "₣"); 表示法郎。

【讨论】:

这是迄今为止此页面上最优雅的答案!构建时的缓存将使其比所有其他需要多次查找的解决方案更快。 最佳答案(在编辑部分之后)!谢谢,verdesmarald! 我收到了ArgumentException: Customized cultures cannot be passed by LCID, only by name.Parameter name: culture。简单的解决方法是将.LCID 替换为.Name。似乎工作。【参考方案3】:

RegionInfo 类有一个CurrencySymbol property,所以它在 C# 中是可行的。如果您想在 Sql Server 中执行此操作,或许可以使用 C# 存储过程。

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

(您需要使用ISO country codes)

【讨论】:

RegionInfo 类也有 ISOCurrencySymbol,它是三字母代码。所以这也是我的建议。诀窍是有效地从可用区域中获取具有特定 ISO 货币代码的区域。【参考方案4】:

这不适用于 Windows Phone 应用程序,因为CultureInfo.GetCultures 在平台上不可用(至少目前还没有)。因此,这是一个快速而肮脏的解决方案 - 在花费者的答案的帮助下完成,其中包含日期的所有文化代码和货币。

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$" ;

【讨论】:

【参考方案5】:

试试这个代码。输入“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】:

在这个帖子的帮助下,我做了一个短字符串扩展方法

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;

【讨论】:

return region?.ISOCurrencySymbol ?? ISOCurrency; 应更改为 return region?.CurrencySymbol ?? ISOCurrency;,因为 ISOCurrencySymbol 返回 3 位货币代码【参考方案7】:

这个答案将@spender 的代码(稍加调整)放在一个实用程序类中,该类尝试将三字母 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;
    

【讨论】:

【参考方案8】:
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;  

【讨论】:

【参考方案9】:

这就是我得到的方式 声明 @CultureCode varchar(10) = 'en-us'

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

【讨论】:

以上是关于3 位货币代码到货币符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Phone 8.1 中获取当前位置的当前货币代码

考虑到货币符号的数字的通用转换

从字符串中提取货币和价格值

ACCESS,货币数据类型等价于具有啥属性的数据数字类型?

比特币Bitcoin源代码安装编译

使用货币符号和千位分隔符解析浮点值