Formateador de moneda .NET: ¿puedo especificar el uso del redondeo bancario?
-
02-07-2019 - |
Pregunta
¿Alguien sabe cómo puedo obtener una cadena de formato para usar redondeo de banqueros ? He estado usando " {0: c} " pero eso no redondea de la misma manera que lo hacen los banqueros. El
Nota: la pregunta original era bastante engañosa, y las respuestas que mencionan expresiones regulares se derivan de eso.
Math.Round ()
Solución
¿No puedes simplemente llamar a Math.Round () en la entrada de la cadena para obtener el comportamiento que deseas?
En lugar de:
string s = string.Format("{0:c}", 12345.6789);
Haz:
string s = string.Format("{0:c}", Math.Round(12345.6789));
Otros consejos
Regexp es un lenguaje de coincidencia de patrones. No puedes hacer operaciones aritméticas en Regexp.
Realice algunos experimentos con IFormatProvider e ICustomFormatter. Aquí hay un enlace que podría apuntarle en la dirección correcta. http://codebetter.com/blogs/david. hayden / archive / 2006/03/12 / 140732.aspx
No es posible, una expresión regular no tiene ningún concepto de " números " ;. Podría usar un evaluador de coincidencias pero estaría agregando el código imperativo de c #, y se desviaría del requisito exclusivo de expresiones regulares.
.Net ha incorporado soporte para aritmética y redondeo de banqueros:
//midpoint always goes 'up': 2.5 -> 3
Math.Round( input, MidpointRounding.AwayFromZero );
//midpoint always goes to nearest even: 2.5 -> 2, 5.5 -> 6
//aka bankers' rounding
Math.Round( input, MidpointRounding.ToEven );
" A " el redondeo es realmente el valor predeterminado, aunque " lejos de cero " Es lo que aprendiste en la escuela.
Esto se debe a que, bajo el capó, los procesadores de computadoras también realizan redondeos bancarios.
//defaults to banker's
Math.Round( input );
Habría pensado que cualquier cadena de formato de redondeo se predeterminaría al redondeo de los banqueros, ¿no es este el caso?
Si está utilizando .NET 3.5, puede definir un método de extensión para ayudarlo a hacer esto:
public static class DoubleExtensions
{
public static string Format(this double d)
{
return String.Format("{0:c}", Math.Round(d));
}
}
Luego, cuando lo llamas, puedes hacerlo:
12345.6789.Format();