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 位货币代码到货币符号的主要内容,如果未能解决你的问题,请参考以下文章