C# 3 位货币代码到货币符号

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12373800/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 23:02:43  来源:igfitidea点击:

3 Digit currency code to currency symbol

c#.netsql-server-2008currency

提问by Sachin Kainth

In C# is it possible to get a currency symbol, like '£', from the 3 character currency code, in this case 'GBP'?

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

Is this possible either in SQL Server or in C#?

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

采纳答案by spender

While a bit brute-force and not particularly elegant, you could do it like this:

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

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

and use it as follows:

并按如下方式使用它:

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

If you anticipate hammering this method, perhaps it's better to build a cache up front:

如果您打算使用此方法,也许最好预先构建一个缓存:

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

At the time of writing, on my machine etc. etc. the map contains the following mappings:

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

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

回答by stuartd

The RegionInfo class has a CurrencySymbol property, so it's doable in C#. You could perhaps use a C# stored procedure if you wanted to do it in Sql Server.

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

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

(You need to use the ISO country codes)

(您需要使用ISO 国家/地区代码

回答by verdesmarald

.NET has CultureInfo.NumberFormat.CurrencySymbol

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

But this requires the culture name, not "GBP". As far as I know its not possible directly from "GBP", etc.

但这需要文化名称,而不是"GBP". 据我所知,它不可能直接来自"GBP"等。

The same information is also available via RegionInfo, along with the currency code:

同样的信息也可以通过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

I suppose one could conceivably use that to construct a map from ISO code to symbol.

我想人们可以想象使用它来构建从 ISO 代码到符号的映射。

The list of culture names is avaliable here.

文化名称列表可在此处获得

EDIT:Well this seems to work:

编辑:嗯,这似乎有效:

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

Note, of course, that this does not produce a comprehensive list. In particular, it does not include old Eurozone currencies that have been superseded by the Euro. I cannot see any way around this but to manually add such currencies if you need them, for example SymbolsByCode.Add("FRF", "?");for French Francs.

请注意,当然,这不会产生一个完整的列表。特别是,它不包括已被欧元取代的旧欧元区货币。我看不到任何解决方法,只能在需要时手动添加此类货币,例如SymbolsByCode.Add("FRF", "?");法国法郎。

回答by Satyabrata Debnath

Try this code. Enter 'USD' as CurrencyCode and all other.

试试这个代码。输入“USD”作为货币代码和所有其他。

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;

    }

回答by Marius Bughiu

This will not work on Windows Phone applications as CultureInfo.GetCulturesis not available on the platform (at least not yet). So here is a quick and dirty solution - made with the help of spender's answer containing all the culture codes and currencies at the date.

这不适用于 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$"} };
}

回答by Zaid

This answer puts @spender's code, with a minor tweak, in a utility class that attempts to convert three-letter ISO currency codes to their presently-circulating symbols. For efficiency, this class uses an internal cache of all previous requests, also suggested by @spender.

这个答案将@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;
    }
}

回答by Skorunka Franti?ek

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

回答by artzuk

With the help of this thread I made a short string extension method

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

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

回答by Richard

This is how I have been getting the DECLARE @CultureCode varchar(10) = 'en-us'

这就是我如何获得 DECLARE @CultureCode varchar(10) = 'en-us'

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

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