Zeros "Perdidos": por que Int não armazena zeros à esquerda e como lidar com isso?
\n\nVocê já tentou exibir na tela o número 007 e recebeu apenas 7? Uma dor familiar? Bem-vindo ao clube de desenvolvedores Swift que, mais cedo ou mais tarde, se deparam com a pergunta: "Como adicionar zeros à esquerda a um Int?".
Esta pergunta no Stack Overflow acumulou milhares de visualizações, e não é surpresa. Parece uma tarefa simples — exibir um número de pedido como "001234" em vez de "1234", ou mostrar a hora como "09:05" em vez de "9:5". Mas o Swift, sendo uma linguagem fortemente tipada, separa o conceito de "número" e sua "representação em string". Int é uma entidade matemática. Para ele, 007 é simplesmente 7. Os zeros à esquerda são perdidos na inicialização.
Neste artigo, vamos analisar todas as principais abordagens para resolver este problema. Você aprenderá como formatar números inteiros corretamente, qual método escolher para diferentes tarefas e como não cair em uma armadilha de desempenho. Percorreremos o caminho desde máscaras de string simples até o poderoso NumberFormatter do Foundation. Vamos nessa!
Por que Int não pode armazenar "001"? Uma breve explicação
\n\nAntes de mergulharmos no código, vamos entender a natureza do fenômeno. Int no Swift é um número inteiro com sinal de 64 bits (ou 32 bits em dispositivos antigos). Sua representação interna é código binário. Um zero à esquerda não tem significado matemático.
let number = 007 // Erro? Não!\nprint(number) // Exibirá: 7\n\nO compilador Swift nem permite que você escreva 007 no código (a menos que seja um literal em octal, mas aí o prefixo é 0o). Conclusão: zeros à esquerda são um problema de formatação, não de armazenamento de dados. Resolvemos o problema no nível de apresentação (UI, logging, exportação).
Método nº 1: O Clássico — String(format:)
\n\nA resposta mais popular no Stack Overflow é usar a função String(format:), herdada do Objective-C (através da ponte com NSString). É uma maneira rápida e concisa.
Exemplo: adicionar 3 zeros à esquerda
\n\nlet number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"\n\nO especificador %04d significa:
- \n
%— início do especificador; \n 0— preencher posições vazias com zeros, não com espaços; \n 4— largura mínima do campo (4 caracteres); \n d— número inteiro decimal (Int). \n
Se o número for maior que 4 caracteres (por exemplo, 12345), a formatação não o truncará — você obterá "12345".
\n\nPrós e Contras
\n- \n
- Prós: Simples, rápido, uma linha. Funciona em todas as versões do Swift. \n
- Contras: Usa
NSStringinternamente, o que pode ser um pouco mais lento que uma solução pura em Swift. É necessário lembrar a sintaxe de formatação no estilo C. Não é localizado (não considera separadores de milhares, se necessário). \n
Quando usar: Para casos simples: logs, depuração, exibição de IDs, quando a localização não é necessária.
\n\nMétodo nº 2: Swift Puro — String(repeating:count:) + sufixo
\n\nSe você quiser evitar a ponte com Objective-C e escrever em Swift "puro", pode fazer isso manualmente. É um ótimo exercício para entender strings.
\n\nextension Int {\n func leadingZeros(_ totalDigits: Int) -> String {\n let stringValue = String(self)\n let zerosCount = max(0, totalDigits - stringValue.count)\n return String(repeating: "0", count: zerosCount) + stringValue\n }\n}\n\nlet number = 42\nprint(number.leadingZeros(5)) // "00042"\n\nComo funciona?
\n- \n
- Convertemos o Int em string. \n
- Calculamos quantos zeros adicionar:
totalDigits - length. Se