Sac*_*nth 45 .net c# currency sql-server-2008
在C#中,有可能从3个字符的货币代码中获得货币符号,例如"£",在这种情况下是"GBP"吗?
这可能在SQL Server或C#中吗?
spe*_*der 75
虽然有点蛮力但不是特别优雅,你可以这样做:
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;
}
Run Code Online (Sandbox Code Playgroud)
并按如下方式使用:
string currSymbol;
if(TryGetCurrencySymbol("GBP",out currSymbol))
{
Console.WriteLine("symbol is {0}", currSymbol);
}
Run Code Online (Sandbox Code Playgroud)
如果您预计会采用这种方法,可能最好先建立一个缓存:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在撰写本文时,在我的机器等等上,地图包含以下映射:
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
Run Code Online (Sandbox Code Playgroud)
ver*_*ald 39
.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); // €
Run Code Online (Sandbox Code Playgroud)
但这需要文化名称,而不是"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
Run Code Online (Sandbox Code Playgroud)
我想可以想象一下,可以使用它来构建从ISO代码到符号的地图.
文化名称列表在这里是可用的.
编辑:这似乎工作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
CurrencyCodeMapper.GetSymbol("USD") // $
CurrencyCodeMapper.GetSymbol("GBP") // £
CurrencyCodeMapper.GetSymbol("EUR") // €
Run Code Online (Sandbox Code Playgroud)
当然,请注意,这不会产生全面的列表.特别是,它不包括已被欧元取代的旧欧元区货币.我无法看到任何解决方法,但如果您需要,可以手动添加此类货币,例如SymbolsByCode.Add("FRF", "?");法国法郎.
小智 7
试试这个代码。输入“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;
}
Run Code Online (Sandbox Code Playgroud)
RegionInfo类有一个CurrencySymbol属性,所以它在C#中是可行的.如果您想在Sql Server中执行此操作,则可以使用C#存储过程.
RegionInfo regionInfo = new RegionInfo("GB");
Console.WriteLine(regionInfo.CurrencySymbol); // £
Run Code Online (Sandbox Code Playgroud)
(您需要使用ISO国家/地区代码)
这在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$"} };
}
Run Code Online (Sandbox Code Playgroud)