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:#}, 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();
}
}
¿Y qué se puede hacer con las cadenas?
/**
* 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);
}
}
}
pello.io