Menu

PHP sprintf(): formatar strings, zeros à esquerda e decimais

sprintf() monta uma string a partir de um formato e de valores: sprintf('%05.2f', 3.14159) retorna "03.14". Veja %s, %d e %f, preenchimento com zeros, casas decimais fixas, alinhamento, numeração de argumentos, printf e vsprintf.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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:

EspecificadorSignificadosprintf(...)Resultado
%sstringsprintf('%s', 'PHP')PHP
%dinteiro (com sinal)sprintf('%d', 42.9)42
%ffloat, 6 casas decimais por padrãosprintf('%f', 1.5)1.500000
%.2ffloat, 2 casas decimaissprintf('%.2f', 1.5)1.50
%enotação científicasprintf('%e', 1234.5678)1.234568e+3
%x / %Xhexadecimalsprintf('%x', 255)ff
%ooctalsprintf('%o', 8)10
%bbináriosprintf('%b', 5)101
%ccaractere a partir de um códigosprintf('%c', 65)A
%uinteiro sem sinalsprintf('%u', 3)3
%%um sinal de porcentagem literalsprintf('%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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR