brdinheiro 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|