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.
@@ -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
+
@@ -0,0 +1,9 @@
1
+ module BrDinheiro
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
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,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestBrDinheiro < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def test_truth
9
+ assert true
10
+ end
11
+ 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