{formatação}

 
14.1 FORMATAÇÃO DO PRINT 

Para termos uma saída, impressa ou gravada, formatada, usamos printf .

(Se você não se lembra que gravamos um registro "printando", reveja a aula 6).

A fórmula é:

printf "formatação",variável;

No lugar de formatação temos:

Exemplos:
        $x = "abcd";
        printf "%8s",$x;
Serão printados: quatro brancos mais abcd (bbbbabcd).

Com números:

        $y = 29.40;
        printf "%8.3f",$y;
Serão printados dois brancos e o número com TRÊS decimais (zero à direita) - bb29.400

IMPORTANTE: Não se esqueça de que a formatação aparece entre aspas!
 
 
14.2 DECIMAIS BRASILEIROS 

Pelo visto no capítulo anterior você poderia pensar que, para transformar um número com o separador ponto em um string semelhante com o separador vírgula bastaria fazer:

        $x = 8.69;
        $x=~s/./,/;
Lêdo engano, como diria Machado de Assis.

O resultado seria:

                ,.68999999 etc.
Isso porque:
  1. Você não se lembra mas o ponto é um caractere curinga nesse negócio de "achar e trocar". Então, na realidade mandamos o PERL substituir o primeiro "qualquer caractere" por uma vírgula. Foi o que ele fez substituindo o 8 por uma vírgula.
  2. Depois, quando operamos com decimais, se não editamos o resultado, o PERL considera uma precisão de 18 casas decimais - donde: SEMPRE EDITE RESULTADOS DE OPERAÇÕES COM NÚMEROS!
No caso em que não queiramos printar diretamente mas jogar numa variável um número com decimais editado "brasileiramente" existe a função: sprintf que usa aquelas mesmas fórmulas de formatação do printf.

Para resolver o problema de substituir O PONTO e não haver confusão com caractere curinga temos de simbolizar o nosso ponto por: \ . (barra invertida-ponto).

Assim, para colocarmos numa variável $xbras aquele $x com o separador brasileiro teríamos que fazer:

        $xbras = sprintf("%4.2f",$x);
        $xbras=~s/\./,/;
Então teríamos em $xbras: 8,69

É meio complicado mesmo, mas funciona!

DICA: Arquive sempre os valores numéricos contendo decimais (preço, por exemplo) com o separador americano.Converta na entrada e desconverta na saída.