En C #, est-il possible d’obtenir un symbole monétaire, tel que "£", à partir du code de devise à 3 caractères, dans ce cas "GBP"?
Est-ce possible dans SQL Server ou en C #?
Un peu brutal et peu élégant, vous pouvez le faire comme ceci:
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;
}
et l'utiliser comme suit:
string currSymbol;
if(TryGetCurrencySymbol("GBP",out currSymbol))
{
Console.WriteLine("symbol is {0}", currSymbol);
}
Si vous prévoyez de marteler cette méthode, il est peut-être préférable de créer une mémoire cache au début:
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);
}
}
Au moment de l'écriture, sur ma machine, etc., etc., la carte contient les mappages suivants:
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$
.NET a 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); // €
Mais cela nécessite le nom de la culture, pas "GBP"
. Pour autant que je sache, ce n'est pas possible directement à partir de "GBP"
, etc.
La même information est également disponible via RegionInfo
, avec le code de devise:
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
Je suppose que l’on pourrait peut-être utiliser cela pour construire une carte du code ISO au symbole.
La liste des noms de culture est disponible ici .
EDIT: Cela semble fonctionner:
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") // €
Notez, bien sûr, que cela ne produit pas une liste complète. En particulier, il n'inclut pas les anciennes monnaies de la zone euro remplacées par l'euro. Je ne vois pas comment contourner ce problème mais ajouter manuellement ces devises si vous en avez besoin, par exemple SymbolsByCode.Add("FRF", "₣");
pour les francs français.
Cela ne fonctionnera pas sur les applications Windows Phone car CultureInfo.GetCultures
n'est pas disponible sur la plate-forme (du moins pas encore). Voici donc une solution rapide et délicate - élaborée à l'aide de la réponse de Spender contenant tous les codes de culture et les devises à la date.
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$"} };
}
La classe RegionInfo a la propriété CurrencySymbol , donc c'est faisable en C #. Vous pourriez peut-être utiliser une procédure stockée C # si vous voulez le faire dans Sql Server.
RegionInfo regionInfo = new RegionInfo("GB");
Console.WriteLine(regionInfo.CurrencySymbol); // £
(Vous devez utiliser les codes de pays ISO )
Essayez ce code. Entrez 'USD' comme CurrencyCode et tous les autres.
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;
}
Avec l'aide de ce fil, j'ai créé une méthode d'extension de chaîne courte
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;
}
Cette réponse place le code de @ spender, avec un tweak mineur, dans une classe d'utilitaires qui tente de convertir les codes de devise ISO à trois lettres en leurs symboles en circulation. Pour plus d'efficacité, cette classe utilise un cache interne de toutes les requêtes précédentes, également suggéré par @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;
}
}
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;
}