brdinheiro 0.0.1

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