Siguiendo con la serie de String.Format del .NET Framework, vamos a presentar en esta ocasión para qué sirve el string.Format y dónde debemos usarlo.
Para empezar, vamos a empezar por mencionar algo muy curioso. En el .NET Framework existe una interfaz: IFormattable. Si tenemos pensamientos de agregar funcionalidad de formato a una clase y queremos que rápidamente se puede acoplar con otro elementos del Framework, implementa esta interfaz.
Dicho esto, hablemos del formateo de strings en .NET
En .NET vamos a encontrar una variedad de clases con métodos sobrecargados como ToString(), que traen varios parámetros más como un string y un IFormatProvider. Además, seguimos teniendo la función Format que los que vienen del Visual Basic Clasico conocerán bien, aunque ahora es un método estático de la clase String (String.Format).
Dentro del maravilloso mundo del formateo de strings hay tres grandes bloques bien diferenciados:
- Formateo de tipos enumerados. Enums con o sin Flags.
- Formateo de fechas y horas. DateTime y TimeSpan.
- Formateo de tipos numéricos. Integers, Double,…
- Formatos personalizados. Formato para nuestras clases, como podría ser representar la representación de un número imaginario en Modulo-Argumento, etc…
En esta entrega (que va a ser la primera de cuatro) vamos a hablar del formateo de los tipos enumerados, que es la más fácil de entender de todas y nos ayudará a meternos en materia.
Formateo de los tipos enumerados
Los tipos enumerados dentro del .Net Framework heredan de manera transparente de la clase System.Enum, una clase abstracta que sirve de base para todas las enumeraciones. Además de ello, a los tipos enumerados se les puede indicar el tamaño/valor que pueden tener siempre que sea uno de estos tipos: byte, ushort, uint, ulong, sbyte, short, int y long. Es decir, que podemos jugar desde 8 hasta 64 bits. Por último, se pueden marcar con el atributo flags si vamos a permitir que pueda utilizarse como tales. Un ejemplo de esto, sería lo siguiente:
//Este tipo enumerado tiene un tamaÃ���Ã�¯Ã�¿Ã�½Ã��Ã�¯Ã��Ã�¿Ã��Ã�½Ã���Ã�¯Ã�¿Ã�½Ã���Ã��Ã�±o de 8 bits (byte)
//y sus valores permiten que puedan definirse flags sin ambigÃ���Ã�¯Ã�¿Ã�½Ã��Ã�¯Ã��Ã�¿Ã��Ã�½Ã���Ã�¯Ã�¿Ã�½Ã���Ã��Ã�¼edad.
[Flags]
public enum TipoBlogs: byte
{
Ninguna = 0, //0000 0000
Personales = 1, //0000 0001
Tecnicos = 2, //0000 0010
Opinion = 4, //0000 0100
Politica = 8 //0000 1000
}
Gracias al tipo enumerado TipoBlogs podríamos crear variables y almacenar en ellas varias cosas. Por ejemplo, veamos cómo definiríamos un blog que hablase de cosas Personales y Políticas.
TipoBlogs tipo = TipoBlogs.Personales | TipoBlogs.Politica;
Dicho esto, pasemos a ver qué posibilidades nos pueden ofrecer el formateo de tipos enumerados del .NET Framework.
| Cadena de formato | Acción resultante |
| G ó g | Muestra el valor de la enumeración con su nombre, en vez de su valor numérico. Si la enumeración permite flags y el valor tiene varios flags, entonces muestra una lista separada por comas con los distintos valores que toma. En caso de no poder representarse así, mostrará su valor numérico.
Ejemplo:
TipoBlogs tipo = TipoBlogs.Personales | TipoBlogs.Politica;
string text = string.Format("{0:G}", tipo);
Console.WriteLine(text);
Resultado: |
| F ó f | Ídem. En el .NET Framework se utiliza “f” como el genérico cuando no se sabe las distintas variedades disponibles de formato. |
| D ó d | Muestra el valor numérico con la notación más compacta posible. Es decir, que si el valor es 9 no podemos utilizar “dd” para conseguir 09. Lanza una FormatException.
Ejemplo:
TipoBlogs tipo = TipoBlogs.Personales | TipoBlogs.Politica;
string text = string.Format("{0:d}", tipo);
Console.WriteLine(text);
Resultado: Dado que utilizamos flags, era evidente. El resultado es un OR entre 00001000 y 00000001 lo cual es 00001001. |
| X ó x | Muestra el valor numérico en hexadecimal, con el mínimo número de caractéres hexadecimales para el tipo numérico. En otras palabras, utilizará dos caracteres para el byte, cuatro para el short y así sucesivamente. Indistintamente de X ó x, mostrará los caracteres hexadecimales en mayúsculas.
Ejemplo:
TipoBlogs tipo = TipoBlogs.Opinion | TipoBlogs.Politica;
string text = string.Format("{0:x}", tipo);
Console.WriteLine(text);
Resultado: Lo cual equivale a 12 en hexadecimal, como ya sabeis. |
Y ahora entraremos en la parte difícil, os preguntareis como funciona el esto del formateo de strings…
Bien, en la clase padre de todos los tipos enumerados (System.Enum), se implementa la interfaz IFormattable. Cuando hacemos una llamada a como string.Format("{0:x}", tipo); por debajo lo que se está haciendo es llamar al método ToString(string format, System.IFormatProvider formatProvider) de IFormattable implementado en Enum. Cuando las llamadas internas del String.Format se han compleado, se concatena todo y se devuelve el resultado.
De ahí, que si implementamos IFormattable en nuestras clases, podremos crear los formatos que necesitemos a nuestra manera. Cosa de la que hablaremos en el capítulo 4 de estas entregas sobre formateo.
Hasta la próxima entrega!
Filed under: String.Format
Recent comments