Como formatear una cantidad a currency en .NET controlando el numero de decimales
Tantas opciones que hay para formatear strings en.NET, que es difícil memorizar todas.
Hoy tuve que formatear una cifra numérica que en la base de datos está como decimal, pero en el UI no quería desplegar ninguno de los decimales. Casi todo el mundo ha utilizado el string.Format(“{0:C”), el cual formatearía como si la cantidad fuera una cifra monetaria, pero eso implica tener decimales.
Algua persona podría pensar en realizar esto desde el stored procedure o el query que trae la información, pero personalmente creo que eso es un error, ya que los datos deben estar siempre intactos y lo unico que debemos modificar es el formato en el que los queremos desplegar. Además, eso implicaría tener que estar controlando también el formato del símbolo separador de miles. Esto es algo que simplemente no se debe hacer en base de datos.
Googleando, encontré en los forums de ASP.NET la siguiente manera de hacerlo, pero tampoco es la más correcta:
System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo(); nfi.CurrencyDecimalDigits = 0; nfi.CurrencySymbol ="$"; myLabel.Text =string.Format(nfi,"{0:C}", ad.Price);
Ya que estoy utilizando esto en un control Repeater, tendría que crear un método con las primeras 3 líneas de texto anteriores, y eso implicaría estar generando varias instancias de NumberFormatInfo.
Para ya no hacer más largo este post, les dejo la solución correcta.
string.Format("0:C0", ad.Price);
Así de sencillo…y no lo especifican en ningun lugar de MSDN…lo vine a encontrar aqui: .NET Format String 101. Obvio decirlo, basta cambiar el C0 por C1, C2, C3 o Cx para determinar el número de decimales que queremos desplegar. Esto también hace mucho más facil poner ese format string en el archivo de configuración y poder reutilizarlo en varias pantallas sin tener que estar cambiando código.
Les dejo también otra buena referencia de string.Format: String Formatting in C#