brdinheiro 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +0 -0
- data/MIT-LICENSE +20 -0
- data/README +0 -0
- data/Rakefile +100 -0
- data/TODO +5 -0
- data/lib/brdinheiro/dinheiro.rb +349 -0
- data/lib/brdinheiro/dinheiro_active_record.rb +41 -0
- data/lib/brdinheiro/dinheiro_util.rb +43 -0
- data/lib/brdinheiro/excecoes.rb +7 -0
- data/lib/brdinheiro/number_portuguese.rb +163 -0
- data/lib/brdinheiro/version.rb +9 -0
- data/lib/brdinheiro.rb +20 -0
- data/test/br_dinheiro_test.rb +11 -0
- data/test/dinheiro_active_record_test.rb +49 -0
- data/test/dinheiro_test.rb +498 -0
- data/test/test_helper.rb +16 -0
- metadata +86 -0
@@ -0,0 +1,163 @@
|
|
1
|
+
module Extenso
|
2
|
+
@@unidade = {
|
3
|
+
0 => "zero",
|
4
|
+
1 => "um",
|
5
|
+
2 => "dois",
|
6
|
+
3 => "três",
|
7
|
+
4 => "quatro",
|
8
|
+
5 => "cinco",
|
9
|
+
6 => "seis",
|
10
|
+
7 => "sete",
|
11
|
+
8 => "oito",
|
12
|
+
9 => "nove"
|
13
|
+
}
|
14
|
+
@@dezena = {
|
15
|
+
10 => "dez",
|
16
|
+
11 => "onze",
|
17
|
+
12 => "doze",
|
18
|
+
13 => "treze",
|
19
|
+
14 => "quatorze",
|
20
|
+
15 => "quinze",
|
21
|
+
16 => "dezesseis",
|
22
|
+
17 => "dezessete",
|
23
|
+
18 => "dezoito",
|
24
|
+
19 => "dezenove",
|
25
|
+
20 => "vinte",
|
26
|
+
30 => "trinta",
|
27
|
+
40 => "quarenta",
|
28
|
+
50 => "cinquenta",
|
29
|
+
60 => "sessenta",
|
30
|
+
70 => "setenta",
|
31
|
+
80 => "oitenta",
|
32
|
+
90 => "noventa" }
|
33
|
+
@@centena = {100 => "cento",
|
34
|
+
200 => "duzentos",
|
35
|
+
300 => "trezentos",
|
36
|
+
400 => "quatrocentos",
|
37
|
+
500 => "quinhentos",
|
38
|
+
600 => "seiscentos",
|
39
|
+
700 => "setecentos",
|
40
|
+
800 => "oitocentos",
|
41
|
+
900 => "novecentos" }
|
42
|
+
|
43
|
+
# Escreve o numero por extenso.
|
44
|
+
#
|
45
|
+
# Exemplo:
|
46
|
+
# 1.por_extenso ==> 'um'
|
47
|
+
# 100.por_extenso ==> 'cem'
|
48
|
+
# 158.por_extenso ==> 'cento e cinquenta e oito'
|
49
|
+
def por_extenso
|
50
|
+
Extenso.por_extenso(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Alias para o metodo por_extenso
|
54
|
+
alias_method :to_extenso, :por_extenso
|
55
|
+
|
56
|
+
# Escreve o numero por extenso.
|
57
|
+
#
|
58
|
+
# Exemplo:
|
59
|
+
# Extenso.por_extenso(1) ==> "um"
|
60
|
+
# Extenso.por_extenso(100) ==> "cem"
|
61
|
+
# Extenso.por_extenso(158) ==> "cento e cinquenta e oito"
|
62
|
+
def Extenso.por_extenso(numero)
|
63
|
+
negativo=(numero<0)?"menos ":""
|
64
|
+
n=numero.to_i.abs
|
65
|
+
return case n
|
66
|
+
when 0..9: negativo + @@unidade[n].to_s
|
67
|
+
when 10..19: negativo + @@dezena[n].to_s
|
68
|
+
when 20..99:
|
69
|
+
v=n % 10
|
70
|
+
if v== 0
|
71
|
+
negativo + @@dezena[n].to_s
|
72
|
+
else
|
73
|
+
"#{negativo}#{@@dezena[n-v]} e #{por_extenso(v)}"
|
74
|
+
end
|
75
|
+
when 100
|
76
|
+
negativo+"cem"
|
77
|
+
when 101..999
|
78
|
+
v=n % 100
|
79
|
+
if v== 0
|
80
|
+
negativo + @@centena[n].to_s
|
81
|
+
else
|
82
|
+
"#{negativo}#{@@centena[n-v]} e #{por_extenso(v)}"
|
83
|
+
end
|
84
|
+
when 1000..999999
|
85
|
+
m,c=n/1000,n%1000
|
86
|
+
%(#{negativo}#{por_extenso(m)} mil#{c > 0 ? " e #{por_extenso(c)}":''})
|
87
|
+
when 1_000_000..999_999_999
|
88
|
+
mi,m=n/1_000_000,n%1_000_000
|
89
|
+
%(#{negativo}#{por_extenso(mi)} milh#{mi > 1 ? 'ões':'ão'}#{m > 0 ? " e #{por_extenso(m)}" : ''})
|
90
|
+
when 1_000_000_000..999_999_999_999
|
91
|
+
bi,mi=n/1_000_000_000,n%1_000_000_000
|
92
|
+
%(#{negativo}#{por_extenso(bi)} bilh#{bi > 1 ? 'ões':'ão'}#{mi > 0 ? " e #{por_extenso(mi)}" : ''})
|
93
|
+
when 1_000_000_000_000..999_999_999_999_999
|
94
|
+
tri,bi=n/1_000_000_000_000,n%1_000_000_000_000
|
95
|
+
%(#{negativo}#{por_extenso(tri)} trilh#{tri > 1 ? 'ões':'ão'}#{bi > 0 ? " e #{por_extenso(bi)}" : ''})
|
96
|
+
else
|
97
|
+
raise "Valor excede o permitido: #{n}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module ExtensoReal
|
103
|
+
include Extenso
|
104
|
+
|
105
|
+
# Escreve por extenso em reais.
|
106
|
+
#
|
107
|
+
# Exemplo:
|
108
|
+
# 1.por_extenso_em_reais ==> 'um real'
|
109
|
+
# (100.58).por_extenso_em_reais ==> 'cem reais e cinquenta e oito centavos'
|
110
|
+
def por_extenso_em_reais
|
111
|
+
ExtensoReal.por_extenso_em_reais(self)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Alias para por_extenso_em_reais
|
115
|
+
alias_method :to_extenso_real, :por_extenso_em_reais
|
116
|
+
|
117
|
+
# Escreve o numero por extenso em reais.
|
118
|
+
#
|
119
|
+
# Exemplo:
|
120
|
+
# Extenso.por_extenso_em_reais(1) ==> "um real"
|
121
|
+
# Extenso.por_extenso_em_reais(100) ==> "cem reais"
|
122
|
+
# Extenso.por_extenso_em_reais(100.58) ==> "cem reais e cinquenta e oito centavos"
|
123
|
+
def ExtensoReal.por_extenso_em_reais(valor)
|
124
|
+
negativo=(valor<0)?" negativo":""
|
125
|
+
negativos=(valor<0)?" negativos":""
|
126
|
+
valor = valor.abs
|
127
|
+
return 'grátis' if valor == 0
|
128
|
+
case valor
|
129
|
+
when Integer
|
130
|
+
extenso = Extenso.por_extenso(valor)
|
131
|
+
if extenso =~ /^(.*)(ão$|ões$)/
|
132
|
+
complemento = 'de '
|
133
|
+
else
|
134
|
+
complemento = ''
|
135
|
+
end
|
136
|
+
%(#{extenso} #{valor <= 1 ? "real#{negativo}": "#{complemento}reais#{negativos}"})
|
137
|
+
when Float
|
138
|
+
real,cents=("%.2f" % valor).split(/\./).map{ |m| m.to_i}
|
139
|
+
valor_cents=Extenso.por_extenso(cents%100)
|
140
|
+
valor_cents+= case cents.to_i%100
|
141
|
+
when 0: ""
|
142
|
+
when 1: " centavo"
|
143
|
+
when 2..99: " centavos"
|
144
|
+
end
|
145
|
+
|
146
|
+
if real.to_i > 0
|
147
|
+
"#{ExtensoReal.por_extenso_em_reais(real.to_i)}#{cents > 0 ? ' e ' + valor_cents + negativos : real.to_i > 1 ? negativos : negativo }"
|
148
|
+
else
|
149
|
+
if (cents.to_i%100)==1
|
150
|
+
"#{valor_cents}#{negativo}"
|
151
|
+
else
|
152
|
+
"#{valor_cents}#{negativos}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
else
|
156
|
+
ExtensoReal.por_extenso_em_reais(valor.to_s.strip.gsub(/[^\d]/,'.').to_f)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
Numeric.send(:include, DinheiroUtil)
|
162
|
+
Numeric.send(:include, ExtensoReal)
|
163
|
+
|
data/lib/brdinheiro.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
%w(dinheiro
|
5
|
+
dinheiro_util
|
6
|
+
dinheiro_active_record
|
7
|
+
excecoes
|
8
|
+
number_portuguese).each {|req| require File.dirname(__FILE__) + "/brdinheiro/#{req}"}
|
9
|
+
|
10
|
+
|
11
|
+
require 'bigdecimal'
|
12
|
+
require 'rubygems'
|
13
|
+
require 'active_record'
|
14
|
+
require 'activesupport'
|
15
|
+
|
16
|
+
String.send(:include, DinheiroUtil)
|
17
|
+
ActiveRecord::Base.send :include, DinheiroActiveRecord
|
18
|
+
|
19
|
+
module BrDinheiro
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
#
|
3
|
+
# class Carteira < ActiveRecord::Base
|
4
|
+
#
|
5
|
+
# usar_como_dinheiro :saldo
|
6
|
+
#
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# class DinheiroActiveRecordTest < Test::Unit::TestCase
|
10
|
+
#
|
11
|
+
# def setup
|
12
|
+
# @carteira = Carteira.new
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# def teste_se_aceita_dinheiro
|
16
|
+
# @carteira.saldo = 8.reais
|
17
|
+
# assert @carteira.save
|
18
|
+
# assert_equal 8.reais, @carteira.saldo
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# def teste_se_aceita_numero
|
22
|
+
# @carteira.saldo = 30
|
23
|
+
# assert @carteira.save
|
24
|
+
# assert_equal 30.reais, @carteira.saldo
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def teste_se_rejeita_valor_invalido
|
28
|
+
# @carteira.saldo = 30
|
29
|
+
# assert @carteira.save
|
30
|
+
# @carteira.saldo = 'bla'
|
31
|
+
# assert !@carteira.save
|
32
|
+
# assert_equal "O valor deve estar preenchido e no formato correto. Ex.: 100.00 .", @carteira.errors['saldo']
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# def teste_se_trata_nulo_corretamente
|
36
|
+
# assert_nil @carteira.saldo
|
37
|
+
# @carteira.saldo = nil
|
38
|
+
# assert_nil @carteira.saldo
|
39
|
+
# @carteira.save
|
40
|
+
# assert_nil @carteira.saldo
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# def test_se_cria_carteira_corretamente_quando_recebe_parametros
|
44
|
+
# carteira = Carteira.new(:saldo => "1")
|
45
|
+
# assert_equal 1.real, carteira.saldo
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
#
|
49
|
+
# end
|