Zeros à Esquerda em Int no Swift: do Caos à Ordem

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

Zeros "Perdidos": por que Int não armazena zeros à esquerda e como lidar com isso?

\n\n

Você 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?".

\n\n

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.

\n\n

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!

\n\n

Por que Int não pode armazenar "001"? Uma breve explicação

\n\n

Antes 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.

\n\n
let number = 007 // Erro? Não!\nprint(number) // Exibirá: 7
\n\n

O 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).

\n\n

Método nº 1: O Clássico — String(format:)

\n\n

A 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.

\n\n

Exemplo: adicionar 3 zeros à esquerda

\n\n
let number = 7\nlet formatted = String(format: "%04d", number)\nprint(formatted) // "0007"
\n\n

O especificador %04d significa:

\n
    \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
\n\n

Se o número for maior que 4 caracteres (por exemplo, 12345), a formatação não o truncará — você obterá "12345".

\n\n

Prós e Contras

\n
    \n
  • Prós: Simples, rápido, uma linha. Funciona em todas as versões do Swift.
  • \n
  • Contras: Usa NSString internamente, 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
\n\n

Quando usar: Para casos simples: logs, depuração, exibição de IDs, quando a localização não é necessária.

\n\n

Método nº 2: Swift Puro — String(repeating:count:) + sufixo

\n\n

Se 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\n
extension 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\n

Como funciona?

\n
    \n
  1. Convertemos o Int em string.
  2. \n
  3. Calculamos quantos zeros adicionar: totalDigits - length. Se

Blogs

Book Recommendations