moneda - separador de miles textbox c#
Formato decimal como moneda según el código de moneda (3)
Debería hacerse pasando CultureInfo
:
CultureInfo ci = new CultureInfo("en-GB");
amount.ToString("C", ci);
Tengo una tabla de cargos con el monto y el código de moneda (USD, JPY, CAD, EUR, etc.) y estoy buscando la forma más fácil de formatear la moneda correctamente. Usar mi código de cultura local (EE. UU.) Y tomar mi decimal.ToString ("c") me da un resultado de $ 0.00, pero me gustaría el signo de moneda correcto y el número de decimales basados en el código.
¿Existen bibliotecas para esto? Por supuesto, puedo escribir una declaración de cambio y reglas personalizadas para cada uno, pero pensé que esto debe haberse hecho antes.
Actualizar:
Modifiqué el código de muestra de Jon B de la siguiente manera
static IDictionary<string, string> GetCurrencyFormatStrings()
{
var result = new Dictionary<string, string>();
foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
var ri = new RegionInfo(ci.Name);
result[ri.ISOCurrencySymbol] =
string.Format("{0}#,#0.{1};({0}#,#0.{1})",
ri.CurrencySymbol,
new string(''0'',
i.NumberFormat.CurrencyDecimalDigits));
}
catch { }
}
return result;
}
Esto me permite simplemente ir a Amount.ToString (Currency ["JPY"]), y el formato arrojará el separador de comas en mi contexto local, pero colocará el símbolo de moneda y los lugares decimales correctos automáticamente.
Avíseme si alguien tiene una manera más limpia de hacerlo, o marcaré la respuesta de Jon como correcta en breve.
Puede construir un diccionario para pasar del símbolo de moneda ISO (USD) al símbolo de moneda ($):
static void Main(string[] args)
{
var symbols = GetCurrencySymbols();
Console.WriteLine("{0}{1:0.00}", symbols["USD"], 1.5M);
Console.WriteLine("{0}{1:0.00}", symbols["JPY"], 1.5M);
Console.ReadLine();
}
static IDictionary<string, string> GetCurrencySymbols()
{
var result = new Dictionary<string, string>();
foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
try
{
var ri = new RegionInfo(ci.Name);
result[ri.ISOCurrencySymbol] = ri.CurrencySymbol;
}
catch { }
}
return result;
}
Esa es la idea básica, tendrá que ajustar eso para satisfacer sus necesidades.
Tenga en cuenta que ciertamente puede usar la clase CultureInfo
para convertir a una cadena para una cultura específica, pero como se señala en el comentario de Alexei, eso hará que cada cadena sea un poco diferente (como 1.00 vs 1.00). Cualquiera que use depende de sus necesidades.
public static class DecimalExtension
{
private static readonly Dictionary<string, CultureInfo> ISOCurrenciesToACultureMap =
CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(c => new {c, new RegionInfo(c.LCID).ISOCurrencySymbol})
.GroupBy(x => x.ISOCurrencySymbol)
.ToDictionary(g => g.Key, g => g.First().c, StringComparer.OrdinalIgnoreCase);
public static string FormatCurrency(this decimal amount, string currencyCode)
{
CultureInfo culture;
if (ISOCurrenciesToACultureMap.TryGetValue(currencyCode, out culture))
return string.Format(culture, "{0:C}", amount);
return amount.ToString("0.00");
}
}
Estos son los resultados de llamar a FormatCurrency para algunos códigos de moneda diferentes:
decimal amount = 100;
amount.FormatCurrency("AUD"); //$100.00
amount.FormatCurrency("GBP"); //£100.00
amount.FormatCurrency("EUR"); //100,00 €
amount.FormatCurrency("VND"); //100,00 ?
amount.FormatCurrency("IRN"); //? 100.00