Especificador de precisión de formato de cadena en Swift: cómo controlar la precisión de salida de números
¡Hola, colega! Si alguna vez te has enfrentado a la necesidad de mostrar un número con una cantidad específica de decimales en Swift, seguramente habrás notado que el clásico String(format:) no siempre se comporta de manera obvia. Especialmente si vienes del mundo de C u Objective-C, donde printf es una vaca sagrada. En este artículo, analizaremos cómo funciona el especificador de precisión de formato de cadena en Swift, por qué a veces «se rompe» y cómo usarlo correctamente. ¡Allá vamos!
¿Qué es el especificador de precisión y para qué sirve?
El especificador de precisión es una parte de la cadena de formato que determina cuántos decimales (o la cantidad total de dígitos) se deben mostrar. En Swift, al igual que en C, se escribe después del punto dentro del especificador de formato. Por ejemplo, %.2f significa «mostrar un número de punto flotante con dos decimales».
Pero aquí hay un detalle: Swift utiliza Core Foundation para el formato de cadenas, y su comportamiento puede diferir de lo que estás acostumbrado a ver en C. Esto es especialmente relevante al trabajar con Double y Float.
Veamos directamente un ejemplo simple que aparece a menudo en preguntas de Stack Overflow:
let pi = Double.pilet formatted = String(format: "%.2f", pi)print(formatted) // Muestra: "3.14"Todo funciona como un reloj. Pero tan pronto como comenzamos a experimentar con formatos más complejos, empiezan las sorpresas.
Tipos principales de especificador de precisión en Swift
En Swift se admiten los siguientes especificadores que afectan la precisión:
%f— número de punto flotante. La precisión indica la cantidad de decimales.%e— notación exponencial. La precisión es la cantidad de dígitos después del punto.%g— elige entre%fy%esegún el valor. La precisión es la cantidad total de dígitos significativos.%d/%i— números enteros. La precisión es la cantidad mínima de dígitos (se rellena con ceros a la izquierda).%s— cadenas. La precisión es la cantidad máxima de caracteres mostrados.
Pero lo más interesante comienza cuando intentamos aplicar precisión a Double o Float a través de String(format:).
Problema popular: «¿Por qué no funciona la precisión?»
Una de las quejas más frecuentes en Stack Overflow: «Escribo String(format: "%.2f", myDouble), pero obtengo un resultado inesperado». Analicemos un escenario típico:
let value: Float = 1.23456789let result = String(format: "%.4f", value)print(result) // Puede mostrar "1.2346" o "1.2345" dependiendo de la compilación¿Por qué? Porque Float tiene una precisión de aproximadamente 6-7 dígitos significativos. Si pasas 1.23456789, se redondea a 1.234568 (o algo similar) antes de llegar al formato. Y la precisión en %.4f ya se aplica a ese valor redondeado.
Para evitar confusiones, usa siempre Double para números de punto flotante si necesitas alta precisión:
let value: Double = 1.23456789let result = String(format: "%.4f", value)print(result) // Muestra de forma confiable "1.2346"Ejemplos avanzados: cómo controlar la precisión dinámicamente
A veces la precisión debe definirse no de forma fija, sino a través de una variable. Swift permite hacerlo de dos maneras:
Método 1: mediante * (asterisco)
En el especificador de formato se puede usar * en lugar de un número, y entonces la precisión se tomará del sigu