O sprintf() retorna uma string montada a partir de um formato e de uma lista de valores: cada marcador % no formato é substituído pelo próximo valor. sprintf('%s is %d years old', 'Ada', 36) retorna "Ada is 36 years old". O printf() recebe os mesmos argumentos, mas imprime o resultado em vez de retorná-lo.
Os marcadores são preenchidos em ordem, da esquerda para a direita. %.2f sempre mostra duas casas decimais (4.50, não 4.5), e %05d completa o número com zeros até cinco dígitos.
Os especificadores de formato
Um marcador é %, modificadores opcionais e depois uma letra para o tipo:
| Especificador | Significado | sprintf(...) | Resultado |
|---|---|---|---|
%s | string | sprintf('%s', 'PHP') | PHP |
%d | inteiro (com sinal) | sprintf('%d', 42.9) | 42 |
%f | float, 6 casas decimais por padrão | sprintf('%f', 1.5) | 1.500000 |
%.2f | float, 2 casas decimais | sprintf('%.2f', 1.5) | 1.50 |
%e | notação científica | sprintf('%e', 1234.5678) | 1.234568e+3 |
%x / %X | hexadecimal | sprintf('%x', 255) | ff |
%o | octal | sprintf('%o', 8) | 10 |
%b | binário | sprintf('%b', 5) | 101 |
%c | caractere a partir de um código | sprintf('%c', 65) | A |
%u | inteiro sem sinal | sprintf('%u', 3) | 3 |
%% | um sinal de porcentagem literal | sprintf('%d%%', 50) | 50% |
Mude os valores abaixo e rode de novo:
%d trunca um float em direção ao zero, então 42.9 vira 42. Se você quer 43, arredonde antes: sprintf('%d', round(42.9)). Uma string que não é número, como 'abc', vira 0 com %d.
Completar com zeros à esquerda
Entre o % e a letra você pode colocar um caractere de preenchimento e uma largura. %05d significa "completar com 0 até a largura 5". É o jeito comum de formatar números de pedido, IDs de nota fiscal, horários e datas.
A largura é um mínimo. Um número maior que a largura é impresso por inteiro.
%05.2f: largura e casas decimais juntas
Com floats, a largura conta cada caractere do resultado, incluindo o ponto decimal e o sinal de menos. É por isso que %05.2f em 3.14159 dá 03.14: cinco caracteres no total, dois deles depois do ponto.
%f usa o separador decimal do locale atual (definido com setlocale()), enquanto %F sempre usa ponto. Se o seu código define um locale e você precisa de ponto para JSON, CSV ou uma API, use %F.
Alinhar texto em colunas
Uma largura positiva alinha à direita, um - antes da largura alinha à esquerda, e ' seguido de um caractere define um caractere de preenchimento personalizado. Combinados, eles alinham relatórios e recibos em texto puro.
%-14s completa o nome do item à direita até 14 caracteres, %8.2f alinha o preço à direita em 8 caracteres, e %'-27s com uma string vazia imprime uma linha de 27 traços. %'*10s completa com * em vez de espaços.
Numerar os argumentos para reutilizá-los ou reordená-los
%1$s significa "o primeiro argumento como string", %2$d "o segundo como inteiro". Marcadores numerados deixam você usar um valor duas vezes ou mudar a ordem sem alterar a lista de argumentos, o que tradutores precisam quando a ordem das palavras muda entre idiomas.
vsprintf, printf e os valores de retorno
O vsprintf() recebe os valores como um único array, o que é prático quando eles já estão num array. O printf() retorna o número de bytes que imprimiu, e o vprintf() é a versão com array do printf().
A contagem do printf() inclui a quebra de linha, então "Hello\n" tem 6 bytes. Para texto multibyte, ela conta bytes, não caracteres.
Poucos argumentos lança um erro
Desde o PHP 8, um formato com mais marcadores do que valores lança um ArgumentCountError em vez de retornar false. Conte os marcadores % (ignorando %%) quando vir esse erro.
A mensagem conta a string de formato como argumento: ArgumentCountError: 4 arguments are required, 3 given. Argumentos a mais são ignorados em silêncio, então o erro oposto não aparece como erro. Se um resultado do sprintf parecer errado, imprima o formato ao lado dos valores. Quando você só precisa de um separador de milhar, o number_format() é mais simples do que montar um com sprintf. A lista completa de modificadores está no php.net.
Perguntas frequentes
Como adiciono zeros à esquerda a um número no PHP?
Use sprintf('%05d', 42), que retorna "00042". O 0 é o caractere de preenchimento e 5 é a largura total. Para uma string, str_pad('42', 5, '0', STR_PAD_LEFT) dá o mesmo resultado.
Como formato um número com 2 casas decimais com sprintf?
Use %.2f: sprintf('%.2f', 3.14159) retorna "3.14" e sprintf('%.2f', 5) retorna "5.00". Adicione uma largura para também preencher: %08.2f dá "00003.14".
Qual a diferença entre printf e sprintf no PHP?
O sprintf() retorna a string formatada para você guardá-la. O printf() a imprime na hora e retorna o número de bytes impressos. echo sprintf(...) e printf(...) produzem a mesma saída.
O que significa %s no PHP?
%s é um marcador para uma string no sprintf() e no printf(): sprintf('Hello, %s', 'Ada') retorna "Hello, Ada". Números passados para %s são convertidos em strings. %d é para inteiros e %f para floats.
Como uso o mesmo argumento duas vezes no sprintf?
Numere os marcadores: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Use aspas simples em volta do formato: dentro de aspas duplas o PHP lê $s como variável, então "%1$s" vira %1 seguido do valor de $s.