A função printf imprime uma string formatada (print formated, em inglês) em alguma saída do sistema. Sua sintaxe apareceu inicialmente no C, no início dos anos 70 e desde então, diversas linguagens de programação a adotaram ao longo dos anos, tais como Java, Go e PHP.

Nesse artigo vamos explorar a utilização básica desta função tão influente. Embora os códigos de exemplo sejam escritos em Java, a sintaxe própria do método pouco muda entre as linguagens.

O primeiro parâmetro do printf é uma string que define a formatação do que será impresso. Ela pode conter dois tipos de objetos: caracteres normais, que simplesmente copiamos para a saída, ou indicadores de formato, que determinam como processamos as variáveis e onde elas devem aparecer no texto. Passamos essas variáveis como argumentos seguintes à string de formatação, sendo possível, inclusive, não passar nenhuma variável ao printf.

Exemplo 1

O primeiro exemplo apenas imprime “Hello, World!”. Note que apenas a string de formatação foi passada ao printf e nenhuma variável.

public class Exemplo1 {
    public static void main(String[] args) {
        System.out.printf("Hello, world!");
    }
}
Resultado da execução do primeiro exemplo usando printf

Exemplo 2

Como segundo exemplo, suponha que queiramos imprimir o nome, idade e altura de um determinado usuário da seguinte forma: “Fulano tem 20 anos e 1,75m de altura”, onde os caracteres sublinhados devem ser substituídos pelos dados de algum usuário.

Podemos fazer isso pondo indicadores de formato nas posições em que os dados devem ser impressos. Desse modo, a string de formatação ficaria assim: “%s tem %d anos e %fm de altura”.

Note que os indicadores de formato sempre começam com o caractere ‘%’ e terminam com um caractere de conversão, que determinam como uma variável será interpretada. Em geral, usamos os caracteres ‘s’, ‘d’ e ‘f’ para strings, inteiros e números de ponto flutuante, respectivamente.

finalmente, o código do segundo exemplo ficaria assim:

public class Exemplo2 {
    public static void main(String[] args) {
        final String nome = "Maria";
        final int idade = 25;
        final double altura = 1.67;

        System.out.printf("%s tem %d anos e %fm de altura", nome, idade, altura);
    }
}
Resultado da execução do segundo exemplo usando printf

Note que a altura foi impressa com seis casas decimais após a vírgula. Podemos fazer com que sejam impressas apenas duas casas decimais utilizando um argumento opcional de formatação.

Os argumentos opcionais aparecem sempre entre o caractere ‘%’ e o caractere de conversão. O argumento que determina a precisão com a qual um número de ponto flutuante é impresso segue o padrão: %[.precisão]conversão, onde os colchetes indicam um parâmetro opcional.

Exemplo 3

Um terceiro exemplo seria o seguinte:

public class Exemplo3 {
    public static void main(String[] args) {
        ...

        System.out.printf("%s tem %d anos e %.2fm de altura", nome, idade, altura);
    }
}
Resultado da execução do terceiro exemplo usando printf

Suponha que quiséssemos que os dados fossem impressos um por linha. Nesse caso, podemos modificar um pouco a nossa string de formatação e adicionar um caractere de nova linha, ‘\n’, onde quisermos que elas sejam inseridas.

Consequentemente, nosso código poderia ficar assim:

public class Exemplo4 {
    public static void main(String[] args) {
        ...

        System.out.printf("Nome: %s\nIdade: %d\nAltura: %.2fm", nome, idade, altura);
    }
}
Resultado da execução do quarto exemplo usando printf

A sintaxe do printf varia um pouco entre as linguagens de programação, especialmente quanto aos parâmetros opcionais. No Java, por exemplo, o printf também tem o nome format. Já no Go, ele é utilizado com letra maiúscula (Printf). A utilização básica, entretanto, permanece a mesma.

Bons estudos!