shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Formatar numeros


From: Valtoir
Subject: Formatar numeros
Date: Wed, 22 Jun 2005 17:52:17 -0300
User-agent: Mozilla Thunderbird 1.0.2 (X11/20050317)


Pessoal, precisava pegar um arquivo texto com registros de tamanho fixo e extrair alguns dados. De posse do layout, resolvi fazer uma funcao para formatar uma coluna de valores em reais cujo dados continham zeros à esquerda, algo como pegar o seguinte:

00000001534
00000025682
00000000150
00004152358

e transformar em:

R$ 15,34
R$ 256,82
R$ 1,50
R$ 41.523,58

Para isso, fiz um script separado, que recebe cada valor e formata. Também aproveitei e fiz algumas consistências a fim de facilitar o reaproveitamento do código. Agora é só transformá-lo numa função. Como gostei do resultado final, resolvi divulgar. Caso alguém queira otimizá-lo, melhor.

Ah, na linha:

[ ${#PARAM} -gt 3 ] && PARAM=$( echo $PARAM | sed 's/^0*//' )

tentei fazer assim para eliminar os zeros à esquerda, pensando em poupar um sed

[ ${#PARAM} -gt 3 ] && PARAM=${PARAM##0}

mas não deu certo... sei lá...

Uél, o scrip é esse aí:

--------------------------------------------8<--------------------------------------------------------------

# Jogo o parametro para uma variavel, o que ja elimina espaços em branco iniciais e finais
PARAM=$1

# Testo se o parametro eh valido (apenas numeros) e saio em caso negativo
[ "$( echo $PARAM | grep -c [^0-9] )" != "0" ] && {
   echo "parâmetro inválido"
   exit 1
}

# Elimino possiveis zeros a esquerda (fora a dezena de centavos e a unidade de real)
[ ${#PARAM} -gt 3 ] && PARAM=$( echo $PARAM | sed 's/^0*//' )

# Adiciono zeros a esquerda se o valor for menor que 1
while [ ${#PARAM} -lt 3 ]; do
   PARAM="0$PARAM"
done

# Coloco o ponto formatador de milhar
[ ${#PARAM} -gt 5 ] && {
   SIZE=$(( ${#PARAM} % 3 + 1 ))
   NEW=${PARAM:0:SIZE}
   PARAM=${PARAM#$NEW}
   NEW=$NEW.
}

while [ ${#PARAM} -gt 5 ]; do
   TMP=${PARAM:0:3}
   NEW=$NEW$TMP.
   PARAM=${PARAM#$TMP}
done

PARAM=$NEW$PARAM

# Formato com simbolo de moeda e virgula decimal
PARAM="R\$ ${PARAM:0:$(( ${#PARAM} - 2 ))},${PARAM:$(( ${#PARAM} - 2 ))}"
echo "<$PARAM>"

--------------------------------------------8<--------------------------------------------------------------


PS: Agora aparece alguém e faz em uma linha, com sed :-)

Valtoir




reply via email to

[Prev in Thread] Current Thread [Next in Thread]