Precisão de formatação de strings em Swift: segredos e exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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 %f e %e dependendo 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ção


Por 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

Blogs

Book Recommendations