Luego de haber visitado el tema del posicionamiento de parámetros en la interpolación de valores dentro de cadenas de texto con Rust, vamos a explorar el formateo de valores con algunos casos prácticos.
Precisión decimal
Siguiendo con el ejemplo del planeta Marte, vamos a formatear la precisión del valor de órbita para que muestre únicamente dos números luego del punto decimal.
fn main() {
let planeta = "Marte";
let orb = 686.971;
println!("A los {orbita:.2} días, {nombre} da una vuelta completa al Sol.",
nombre = planeta,
orbita = orb);
}
>> A los 686.97 días, Marte da una vuelta completa al Sol.
Sencillo, ¿no?. Dentro del marcador de posición para órbita hemos agregado ":.2".
El formato de precisión rendondea el número, como se puede apreciar en los siguientes ejemplos:
fn main() {
println!("{:.0}", 5.51); // -> 6
println!("{:.0}", 5.50); // -> 6
println!("{:.0}", 5.49); // -> 5
}
Cuando el formato de precisión excede la cantidad de decimales del número original, se rellenarán las posiciones restantes con ceros:
fn main() {
println!("{:.5}", 5.51); // -> 5.51000
println!("{:.5}", 5.50); // -> 5.50000
println!("{:.5}", 5.49); // -> 5.49000
}
El parámetro de precisión también puede ser nombrado:
fn main() {
println!("{:.prec$}", 5.56, prec = 1); // -> 5.6
}
El parámetro nombrado tiene efecto si se le acompaña con el signo $ al final.
Ancho y alineación
Podemos establecer el ancho mínimo que ocupará un valor, un recurso ideal para distribuir con exactitud información sobre la pantalla.
fn main() {
println!("{:>20} {}", "NOMBRE:", "Jupiter");
println!("{:>20} {} días" , "PERÍODO ORBITAL:", 4332.59);
println!("{:>20} {} km/s", "VELOCIDAD ORBITAL:", 13.07);
println!("{:>20} {} Tierras", "RADIO ECUATORIAL:", 11.209);
}
Este código devolverá algo como lo siguiente:
NOMBRE: Júpiter
PERÍODO ORBITAL: 4332.59 días
VELOCIDAD ORBITAL: 13.07 km/s
RADIO ECUATORIAL: 11.209 Tierras
Con {:>20} estamos definiendo que los textos en la primera posición van a ocupar 20 espacios alineando a la derecha el contenido.
La alineación se puede definir de tres modos:
- > Derecha
- < Izquierda
- ^ Centrado
Con todo lo aprendido podemos presentar datos en forma de columnas:
fn main() {
println!("{:^12}\t{:^12}", "PLANETA", "ÓRBITA");
println!("{:^12}\t{:^12.2}", "Tierra", 365.256);
println!("{:^12}\t{:^12.2}", "Marte", 686.971);
println!("{:^12}\t{:^12.2}", "Júpiter", 4332.59);
}
Que nos devuelve algo como esto:
PLANETA ÓRBITA
Tierra 365.26
Marte 686.97
Júpiter 4332.59
Mientras que con {:^12} le indicamos a println! que designe 12 espacios de ancho al primer texto alineándolo al centro, con {:^12.2} estamos haciendo lo mismo a la segunda cantidad al tiempo que le limitamos a presentar dos números luego del punto decimal. En medio de ambos marcadores de posición estamos colocando un salto de tabulador con \t.
Rellenando
Es posible definir un carácter de relleno, como en el siguiente ejemplo:
fn main() {
println!("{:-^12}\t{:-^12}", "PLANETA", "ÓRBITA");
}
Que resulta en lo siguiente:
--PLANETA--- ---ÓRBITA---
Ahora los que antes eran espacios en blanco han sido ocupados con guiones medios -.
¿Qué tal si usamos esta posibilidad en nuestra anterior tabla de planetas para separar nuestros encabezados de los datos con líneas de guiones?.
fn main() {
println!("{:^12}\t{:^12}", "PLANETA", "ÓRBITA");
println!("{:-^12}\t{:-^12}", "", "");
println!("{:^12}\t{:^12.2}", "Tierra", 365.256);
println!("{:^12}\t{:^12.2}", "Marte", 686.971);
println!("{:^12}\t{:^12.2}", "Júpiter", 4332.59);
}
Que resulta en lo siguiente:
PLANETA ÓRBITA
------------ ------------
Tierra 365.26
Marte 686.97
Júpiter 4332.59
Fin de la segunda parte.
Comunidad mexicana de Rust
Nota: el texto fue publicado originalmente el 19 de julio de 2017 en Medium y lo he migrado a Dev.to el 11 de septiembre de 2019 con actualizaciones mínimas.
Discussion