My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ----------------------------------------------------------------------------
# Calculadora.
# Wrapper para o comando bc, que funciona no formato brasileiro: 1.234,56.
# Obs.: Números fracionados podem vir com vírgulas ou pontos: 1,5 ou 1.5.
# Use a opção --soma para somar uma lista de números vindos da STDIN.
#
# Uso: zzcalcula operação|--soma
# Ex.: zzcalcula 2,20 + 3.30 # vírgulas ou pontos, tanto faz
# zzcalcula '2^2*(4-1)' # 2 ao quadrado vezes 4 menos 1
# echo 2 + 2 | zzcalcula # lendo da entrada padrão (STDIN)
# zzseq 5 | zzcalcula --soma # soma números da STDIN
#
# Autor: Aurelio Marinho Jargas, www.aurelio.net
# Desde: 2000-05-04
# Versão: 3
# Licença: GPL
# ----------------------------------------------------------------------------
zzcalcula ()
{
zzzz -h calcula "$1" && return

local soma

# Opção de linha de comando
if test "$1" = '--soma'
then
soma=1
shift
fi

# Dados via STDIN ou argumentos
zztool multi_stdin "$@" |

# Limpeza nos dados para chegarem bem no bc
sed '
# Espaços só atrapalham (tab+espaço)
s/[ ]//g

# Remove separador de milhares
s/\.\([0-9][0-9][0-9]\)/\1/g
' |

# Temos dados multilinha para serem somados?
if test -n "$soma"
then
sed '
# Remove linhas em branco
/^$/d

# Números sem sinal são positivos
s/^[0-9]/+&/

# Se o primeiro da lista tiver sinal + dá erro no bc
1 s/^+//' |
# Junta as linhas num única tripa, exemplo: 5+7-3+1-2
tr -d '\n'
else
cat -
fi |

# O resultado deve ter somente duas casas decimais
sed 's/^/scale=2;/' |

# Entrada de números com vírgulas ou pontos, saída sempre com vírgulas
sed y/,/./ | bc | sed y/./,/ |

# Adiciona separador de milhares
sed '
s/\([0-9]\)\([0-9][0-9][0-9]\)$/\1.\2/

:loop
s/\([0-9]\)\([0-9][0-9][0-9][,.]\)/\1.\2/
t loop
'
}

Change log

r710 by aureliojargas on Mar 29, 2012   Diff
SEGURANÇA: $1 colocado entre aspas na
chamada padrão zzzz -h de todas as
funções.
Go to: 
Sign in to write a code review

Older revisions

r671 by aureliojargas on Mar 28, 2012   Diff
lint: zzcalcula: melhorados os
comentários.
r670 by aureliojargas on Mar 28, 2012   Diff
lint: padronização dos comentários nas
chamada de zztool multi_stdin.
r668 by aureliojargas on Mar 28, 2012   Diff
lint: removendo espaços inúteis.
All revisions of this file

File info

Size: 1867 bytes, 75 lines
Powered by Google Project Hosting