+1

Usando a função sprintf()

criado por Jayr H. C. Porto em 17/12/2003 3:29pm
Na maioria das vezes que utilizamos a função, estaremos tratando nosso resultado para ser exibido conforme nossa vontade. Para essa finalidade, utilizaremos o %s como especificador que diz ao php para tratar seu correspondente como literal (string). Porém, podemos utilizar de outros especificadores e milhares de combinações diferentes para obter resultados diversos. Vejamos seus tipos:

% - Um caracter literal de porcentagem. Nenhum argumento é requerido. È utilizado como demarcador de precedencia, ou seja, o que vier depois dele informará ao php como proceder.

c – O argumento será tratado como inteiro e será exibido conforme seu valor ASCII. O exemplo a seguir exibirá toda a lista de caracteres ASCII de 1 a 255.
<?
for ($i=1; $i<256; $i++) {
	printf('Valor %s: %c <br>', $i, $i);
}
?>

d – O argumento será tratado como inteiro e exibido como um número decimal (com sinal).
<?
for ($i=-256; $i<256; $i++) {
	printf('Valor %s: %d <br>', $i, $i);
}
?>

Este exemplo exibirá uma lista contendo valores de –256 a 255. Uma variante interessante para este especificador é fixar a quantidade de dígitos a serem exibidos. Por exemplo, fixando em 4 dígitos teriamos:
<?
for ($i=-256; $i<256; $i++) {
	printf('Valor %s: %04d <br>', $i, $i);
}
?>

Note que os numeros negativos serão exibidos como –256 pois o símbolo “-“ contará como um caracter (dos quatro).

u - O argumento será tratado como inteiro e exibido como um número decimal (sempre positivo). Cuidado com seu uso pois números negativos serão convertidos em uma base que desconheço. Qualquer colaboração é bem vinda.

f - O argumento será tratado como decimal e apresentado conforme formatação decimal requerida. É bom saber que o número será arredondado conforme regra geral do php. Veja a regra de numeros com decimais (ponto flutuante) em http://www.php.net/manual/pt_BR/language.types.float.php.
Veja no exemplo abaixo:
<?
$i1 = "1";
$i2 = "1.1";
$i3 = "1.11";
$i4 = "1.111";
$i5 = "1.114";
$i6 = "1.115";
$i7 = "1.116";
$i8 = "1.119";
printf('Valor %s: R$ %01.2f <br>', $i1, $i1); // Valor 1: R$ 1.00 
printf('Valor %s: R$ %01.2f <br>', $i2, $i2); // Valor 1.1: R$ 1.10 
printf('Valor %s: R$ %01.2f <br>', $i3, $i3); // Valor 1.11: R$ 1.11 
printf('Valor %s: R$ %01.2f <br>', $i4, $i4); // Valor 1.111: R$ 1.11 
printf('Valor %s: R$ %01.2f <br>', $i5, $i5); // Valor 1.114: R$ 1.11
printf('Valor %s: R$ %01.2f <br>', $i6, $i6); //  Valor 1.115: R$ 1.11
printf('Valor %s: R$ %01.2f <br>', $i7, $i7); //  Valor 1.116: R$ 1.12
printf('Valor %s: R$ %01.2f <br>', $i8, $i8); // Valor 1.119: R$ 1.12 
?>

NOTA: Um metodo mais simples de formatar números com casas decimais (entre outras vantagens) é o uso do number_format()

o – O argumento será tratado como inteiro e exibido conforme notação octal.
<?
$i1 = "123456789";
printf('Valor %s: %o <br>', $i1, $i1); // Valor 123456789: 726746425
?> 

s – O argumento será tratado e apresentado como literal (string). Já amplamente exemplificado).

x – O argumento será tratado como inteiro e apresentado como número hexadecimal, apresentando as letras em caixa baixa.
<?
$i1 = "-123456789";
printf('Valor %s: %x <br>', $i1, $i1); // Valor -123456789: f8a432eb
?>

X - O argumento será tratado como inteiro e apresentado como número hexadecimal, apresentando as letras em caixa alta.
<?
$i1 = "-123456789";
printf('Valor %s: %X <br>', $i1, $i1); // Valor -123456789: F8A432EB
?>

Uma consideração sobre matrizes:
Evite instanciar matrizes na função printf(). Obtive inúmeros problemas quando referenciava matrizes diretamente no corpo da função, obtendo os mais diversos tipos de erros. Este erro ocorre, principalmente, com elementos multidemensionais.

Comentários:

Mostrando 1 - 6 de 6 comentários
Prof. Baco disse:
Olá tudo bem?
Eu li o seu artigo e o achei muito interessante mas não estou conesguindo formatar o valor de mil e milhar, ou seja:
$v1 = 1,234
$v2 = 134,358
sprintf('%0.2f',$v1) = 1.24
sprintf('%0.2f',$v2) = 134.36
Até aí tudo bem, mas se eu tiver valores acima de 1000, como por exemplo
$v3 = 1234,44343
sprintf('%0.2f',$v3) = 1234.44
E eu queria que ficasse assim:
sprintf('%0.2f',$v3) = 1 234.44
Mas não fica... sabe como resolver este problema?
24/10/2006 12:05pm (~17 anos atrás)

Alexandre disse:
Existe uma forma fácil de formatar os números e valores para o Brasil usando sprintf:

A função sprintf ou printf utiliza as informações da localidade atual. Isto pode, e vai, variar de um OS para outro.

Utilize antes das funções sprintf ou em um local genérico o seguinte :

setlocale(LC_ALL,'pt_BR');

O ideal é consultar a documentação de setlocale para mais detalhes.

Veja o resultado
em um exemplo simples:

<?php
$number = 192.65;
echo setlocale(LC_ALL,'pt_BR');
echo sprintf("%01.2f",$number);
?>

Produzirá a saída :

192,65

Usando isto vc pode estender para colocar a literal R$ antes e etc...


Espero ter ajudado !
Alexandre




15/12/2005 5:04am (~18 anos atrás)

Valeu, gostei muito da sua dica, ja fiquei muitas vezes doido na hora de imprimir muita informação, acho que agora terei menos problemas.
28/11/2005 4:59am (~18 anos atrás)

É bom lembrar que é interessante usar stripslashes ao invés de escapar com barras invertidas... principalmente ao retornar de um banco de dados onde as vezes não sabemos que resultado virá.

ex: $nome = stripslashes($nome)
09/01/2004 12:05pm (~20 anos atrás)

Na realidade, sprintf() e printf() são a mesma função em php. Eu utilizei o Sprint no título e no preâmbulo do artigo pois é a função onde esta a descrição do uso no manual do PHP.

Mesmo no manual, você poderá verificar que a descrição da função se encontra no tópico sprintf. Se você acessar o printf, ele diz que a explicação esta na outra função. Para simplificar o entendimento de alguém que por ventura quisesse verificar no manual, tentei ser coerente.
26/12/2003 5:47am (~20 anos atrás)

Primeiro quero falar que ta bem legal o artigo... e eh bem interessante o uso dessa funcao.
Mas nao entendi se vc queria falar sobre sprintf ou printf, acho que provavelmente errou no titulo, ja que usou printf() no artigo
21/12/2003 7:25pm (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)