Especificador de precisão de formato de string em Swift: como controlar a precisão da saída de números
Olá, colega! Se você já precisou exibir um número com uma quantidade específica de casas decimais em Swift, provavelmente notou que o clássico String(format:) nem sempre se comporta de forma óbvia. Especialmente se você vem do mundo C ou Objective-C, onde printf é uma vaca sagrada. Neste artigo, vamos entender como funciona o especificador de precisão de formato de string em Swift, por que ele às vezes "quebra" e como usá-lo corretamente. Vamos lá!
O que é o especificador de precisão e para que serve?
O especificador de precisão é uma parte da string de formato que determina quantas casas decimais (ou a quantidade total de dígitos) devem ser exibidas. Em Swift, assim como em C, ele é escrito após o ponto dentro do especificador de formato. Por exemplo, %.2f significa "exibir um número de ponto flutuante com duas casas decimais".
Mas há uma nuance: o Swift usa o Core Foundation para formatação de strings, e seu comportamento pode diferir do que você está acostumado a ver em C. Isso é especialmente verdadeiro ao trabalhar com Double e Float.
Vamos dar uma olhada imediata em um exemplo simples que aparece frequentemente em perguntas no Stack Overflow:
let pi = Double.pilet formatted = String(format: "%.2f", pi)print(formatted) // Exibirá: "3.14"Tudo funciona perfeitamente. Mas quando começamos a experimentar com formatos mais complexos, surgem surpresas.
Principais tipos de especificador de precisão em Swift
Em Swift, os seguintes especificadores que afetam a precisão são suportados:
%f— número de ponto flutuante. A precisão indica a quantidade de casas decimais.%e— notação exponencial. A precisão é a quantidade de dígitos após o ponto.%g— escolhe entre%fe%edependendo do valor. A precisão é a quantidade total de dígitos significativos.%d/%i— números inteiros. A precisão é a quantidade mínima de dígitos (preenchido com zeros à esquerda).%s— strings. A precisão é a quantidade máxima de caracteres exibidos.
Mas o mais interessante começa quando tentamos aplicar precisão a Double ou Float através de String(format:).
Problema popular: "Por que a precisão não funciona?"
Uma das reclamações mais comuns no Stack Overflow: "Eu escrevo String(format: "%.2f", myDouble), mas obtenho um resultado inesperado". Vamos analisar um cenário típico:
let value: Float = 1.23456789let result = String(format: "%.4f", value)print(result) // Pode exibir "1.2346" ou "1.2345" dependendo da compilaçãoPor quê? Porque Float tem uma precisão de cerca de 6-7 dígitos significativos. Se você passa 1.23456789, ele é arredondado para 1.234568 (ou algo próximo) antes mesmo de chegar ao formato. E a precisão em %.4f já é aplicada a esse valor arredondado.
Para evitar confusão, sempre use Double para números de ponto flutuante quando precisar de alta precisão:
let value: Double = 1.23456789let result = String(format: "%.4f", value)print(result) // Exibirá de forma confiável "1.2346"Exemplos avançados: como controlar a precisão dinamicamente
Às vezes, a precisão precisa ser definida não de forma fixa, mas através de uma variável. O Swift permite fazer isso de duas maneiras:
Método 1: através de * (asterisco)
No especificador de formato, você pode usar * em vez de um número, e então a precisão será obtida do seg