C# día 11: E/S standar
Vamos a ver que se puede hacer con la entrada y salida standar de consola. Hay opciones muy interesantes con los formatos numéricos, el manejo de fechas y las conversiones. Vamos que se puede hacer con el WriteLine
/** * Formato.cs * Esta clase muestra los distintos formatos que se pueden aplicar * a la hora de mostrar datos por pantalla o por un flujo de salida. */ using System; // Clase Formato // contiene métodos en los que se muestran técnicas de formato public class Formato { // Enumeración que usaremos más adelante enum Evangelistas { Mateo, Marcos, Stallman, Stevens } // Constructor public Formato () { } // Formatos numericos // En los WriteLine("valor {0}", var) // se puede usar alg así {0:¿Y qué se puede hacer con las cadenas?#}, donde '#' marca los digitos public void numericos() { double PI = 3.14159265; int pi = 3141592; int bestia = 66666; System.Console.WriteLine("Pi es {0}", PI); // Mostramos numeros de coma flotante con distinto numero de decimales System.Console.WriteLine("Pi es {0:#.##} o {0:#.####}", PI); // poniendo C (currency) sale como moneda, y con d o D: decimales System.Console.WriteLine("Pi es en moneda {0:C} {0:d}", pi); // Podemos usar la funcion toString, aplicable a cualquier variable string valor = bestia.ToString("C"); // También podemos formatear sobre el string string formateado = string.Format("La bestia {0:C1} {0:d2}", bestia); System.Console.WriteLine("{0}", formateado); // Posibilidades // C : currency o moneda // D o d : decimales // F o f : fixed point // E o e : exponencial // N o n : numerico // X o x : hexadecimal, 31337'5 choice // G o g : general // R o r : roundtrip, para mantener precisión despues de conversiones // Opciones: , (comas) . (puntos) # (cifras) 0 (relleno de 0) // % (porcentajes) (escape para caracteres) 'abc' (texto) // ejemplo: {0:##.##%} System.Console.WriteLine("A ver {0:##.#%} y {0:'Valor: '###}", bestia); // NEGATIVOS: se puede poner un formato específico para negativos o positivos // la forma es así {0:formato_pos;formato_neg;cero} // Por ejemplo {0:d2:d4:'0'} System.Console.WriteLine("Valor {0:#.##;g2;'0'}", PI); } // Formato de fechas public void fechas () { // Para empezar sacamos la fecha actual DateTime fecha = DateTime.Now; // De la fecha podemos sacar el dato que nos interese // fecha.Date, fecha.Month, fecha.Day, fecha.Year, fecha.Hour, fecha.Minute // ... System.Console.WriteLine("La date: {0}", fecha.Date); // También se pueden usar modificadores de formato // para sacar la fecha a nuestro gusto // d, D, f, F, g, G, M, m, R, s, t , T,u , U, Y, y System.Console.WriteLine("Hoy es {0:d} o {0:F}", fecha); } // Enumeraciones: también tienen distinta forma de mostrarse // gracias a los formatos public void enumeraciones () { Evangelistas melenudo = Evangelistas.Stallman; Evangelistas apostol = Evangelistas.Marcos; // Vamos a ver que formato se le puede dar // D o d: valor numérico de la enumeración // G o g: valor de cadena // X o x: hexadecimal del numérico System.Console.WriteLine("Evangelista {0:d} {0:G} {1:x}", melenudo, apostol); } // Metodo principal public static void Main () { Formato formato = new Formato(); formato.numericos(); formato.fechas(); formato.enumeraciones(); } }
/** * Cadenas.cs * clase para ver que podemos hacer con las cadenas * IMPORTANTE: por lo visto no se puede modificar una variable String * C# lo que hace es crear otro String para modificar uno existente, * cosa que seguramente se notará en el rendimiento de c# respecto a * otros lenguajes, vamos digo yo. */ using System; using System.Text; // Para el StringBuilder // Clase que muestra el uso de cadenas public class Cadenas { // Método principal public static void Main () { string cadena = " Que cadena tan interesante "; string separame = "un:día:vi:una:vaca:vestida:de:uniforme"; // Formateador de strings especial @, gracias c0der. // Se toma literalmente lo que le pases System.Console.WriteLine(@"""Cómo mola el editor se vuelve loco"""); // Funciones para string, tenemos las miticas de siempre, ver API // Concat, Copy, Equals, Clone, IndexOf, LastIndexOf // Split vs Join,StartsWith, Substring, ToLower, ToUpper, Replace,.. System.Console.WriteLine("Hazme un trim [{0}]", cadena.Trim()); System.Console.WriteLine("Tamaño:{0}", cadena.Length); // Vamos a probar el Split que siempre viene bien string[] cadenitas = separame.Split(':'); foreach (string item in cadenitas) { System.Console.WriteLine("Toma {0}",item); } // Y el paso contrario: Join string unelos = string.Join(":", cadenitas); System.Console.WriteLine("Unidos de nuevo {0}", unelos); // Para crear una cadena y poder modificarla // La debemos crear como StringBuilder StringBuilder superCadena = new StringBuilder("Inicio"); System.Console.WriteLine("Al principio: {0}", superCadena); // Ahora le metemos más texto superCadena.Append(", pero ahora más."); System.Console.WriteLine("y luego: {0}", superCadena); // Ahora se lo insertamos a partir de la posición 7 superCadena.Insert(7, "a que ha cambiado?"); System.Console.WriteLine("y ya: {0}", superCadena); } }Y con la entrada standar recogemos caracteres o variables de cualquier tipo. Con la función Convert podemos hacer las conversiones que hagan falta:
/** * EntradaDatos.cs * Clase que muestra el uso de la entrada de datos * por el std input. */ using System; public class Entrada { // Método estático para usar desde Main // sin crear instancias public static void leeEntrada() { double coma = 0.00; string entrada = ""; // ReadLine: para leer variables mas largas de un caracter // debemo usar ReadLine. Esto se guarda en un String y después // debemos convertir ese valor con la función Convert try { System.Console.WriteLine("Mete un número de coma flotante"); entrada = System.Console.ReadLine(); coma = Convert.ToDouble(entrada); System.Console.WriteLine("Has metido: {0}", coma); } catch (Exception e) { System.Console.WriteLine("Cascó alguna conversión {0}", e); } // CONVERSIONES DISPONIBLES // ToBoolean, Tobyte, ToChar, ToDateTime, ToDecimal // ToDouble, ToInt16, ToInt32, ToInt64, ToString, ToUInt16, ToUInt32, ToUInt64 } // Método principal public static void Main () { char caracter = ' '; int valor = 0; // Probamos la función leeEntrada leeEntrada(); // Con el método Read a secas solo se lee un caracter System.Console.WriteLine("Mete caracteres y luego algún x"); // Por ejemplo, esto lee hasta que metas x while ( (valor = System.Console.Read())!= 'x') { // Hacemos conversión a caracter caracter = (char) valor; System.Console.Write("{0}", caracter); } } }