Posts by: Gabriel

Como formatear una cantidad a currency en .NET controlando el numero de decimales

.NET

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#

Aplicar formatos condicionales a numeros con string.Format

.NET

Esto es algo que descubrí hoy referente a formateo de números en .NET y que por más simple que parezca, tiene mucha utilidad, ya que puede reducir un bloque de 3 o 6 líneas de código, a una sola línea.

En lugar de necesitar varios if’s para evaluar el valor del número que vamos a formatear y poder determinar el formato que se va a aplicar (desplegar el número entre paréntesis si es negativo, desplegar la palabra Cero si el número es 0, etc), se puede hacer todo el una sola línea, ya que el metodo ToString() permite formatos condicionales de 2 o 3 condiciones…es decir, podemos hacer esto:


const string formato = "000;(##);Cero";

 Console.WriteLine(7.ToString(formato)); // va a desplegar "007"
 Console.WriteLine((-5).ToString(formato)); // va a desplegar "(5)"
 Console.WriteLine(0.ToString(formato)); // va a desplegar "Cero"

Formatos condicionales en .NET usando ToString()

Formatos condicionales en .NET usando ToString()

El formato entonces es:  “positivo;negativo;cero”.

También es posible especificar solo el formato positivo y negativo.

Espero les sirva.

Usar el operator ternario de C# con nullables

.NET

.NET

Todos los días se aprende algo…

Desde hace mucho tenemos disponible el operador ternario (o condicional) en C#, también conocido como el operador “?“.

El operador ternario sirve para regresar/usar uno de dos posibles valores, dependiendo de una condición boleana.

La estructura es:

condicion-boleana ? valor-si-se-cumple : valor-si-no-se-cumple

Es decir, permite reducir de esto:


int? myVar; //variable int nullable

if(string.IsNullOrEmpty(textbox1.Text))

{ myVar = null; }

else

{ myVar = Convert.ToInt32(textbox1.Text); }

a esto:


myVar =string.IsNullOrEmpty(textbox1.Text) ? null : Convert.ToInt32(textbox1.Text);

Y uno esperaría que el código del segundo bloque compile, pero no es así. En lugar de que funcione, el compilador nos marca el siguiente error:

Type of conditional expression cannot be determined because there is no implicit conversion between ‘<null>’ and ‘int’

Yo llevaba años usando el operador ternario y siempre me pareció ilógico que no se permitiera esto. Y probablemente fue más ilógico el hecho de nunca haber googleado como solucionar esto..ya que la solución es simple.


myVar =string.IsNullOrEmpty(textbox1.Text) ? (int?)null : Convert.ToInt32(textbox1.Text);

o


myVar =string.IsNullOrEmpty(textbox1.Text) ? null : (int?)Convert.ToInt32(textbox1.Text);

Simple…el compilador tenía razon. No hay una conversión implícita entre null e int, pero sí entre null y Nullable<int> (a.k.a. int?). Casteando cualquiera de los lados de la expresión, va a compilar sin problemas.

Espero les sirva.

God Mode (O Modo Dios) en Windows 7, Vista y Server 2008

El God Mode (o Modo Dios) en Windows 7, se logra simplemente agregando un nuevo folder en el Desktop y poniendole como nombre:

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Una vez que hagamos eso, inmediatamente aparecera en el desktop un shortcut que se verá asi:

God Mode en Windows 7

God Mode en Windows 7

Al dar doble click sobre el ícono, abrirá una pantalla que nos da acceso a 278 configuraciones específicas de Windows 7, divididas en 46 categorías. El siguiente es solo un screenshot de algunas de las categorías y los settings que podemos alterar, desde un solo lugar:

Algunas configuraciones disponibles en el God Mode en Windows 7

Algunas configuraciones disponibles en el God Mode en Windows 7

Funciona en Windows 7, Windows Vista y Windows Server 2008, PERO, al parecer las ediciones de 64 bits de Vista y 2008 Server presentan problemas a la hora de agregar el shortcut, así que no es recomendable probarlos. El God Mode funciona bien en 32 bits para los 3 sistemas operativos y Windows 7 64 bits.

Definitivamente a mi me servirá la próxima vez que esté intentando ayudar a alguien a reconfigurar algo de su máquina, especialmente por telefono…..tener todos los settings en el mismo lugar evita el típico: “Entra a esta categoría, dime si ves este icono, etc..”.

Espero les sirva.

1 10 11 12 13 14 31  Scroll to top