monto_escrito 0.0.1 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b5aca09925d7886ac7ee203402c9a749eb5bfb4
4
- data.tar.gz: 0c2ee0b819abddd9419d6a8951093328dd9e5056
3
+ metadata.gz: 531120575aa60bf6128ea3723d8842c96325d3f8
4
+ data.tar.gz: 248577fa1223229137313d453bc3805ebe3c56c0
5
5
  SHA512:
6
- metadata.gz: 6ebf9a8b0352a396124226cc407a8707f34b8de9638d4b22f5c5becb4282dafadc975cbbaa37fc911fa5f81e0732704c1ae0cb3706044390f61959f635103251
7
- data.tar.gz: 39b9c9b4d655457ade61d7011d4af36dae3b0ce8d5b4526a628291978d38bf2954fcf668f2fafed61066bc559a6d5a35239aa8bcbeb0039adb83cd5f50c0d59e
6
+ metadata.gz: c8857dc09ff77ebf98104032fe500b0f188a691b12eb72a6b137f84dc561771ae5ad56fb4d46170f0fd492ac5dc9855cb9e6703e9cb23e8c0467c7c99680d95d
7
+ data.tar.gz: ab2cc0b51f32b7b8c0cf9c5f7d4e4d273ff0061c7c2817a5921ddcf0ac10cae20c0d5f60065354e4625335df6b730853df0e4a249e2188ff51def2635b13ddc5
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .rvmrc
19
+ .rbenv-gemsets
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/README.md CHANGED
@@ -18,13 +18,19 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- Para convertir una cantidad a palabras, simplemente hay que utilizar el método `convertir` del helper `MontoEscrito::Conversor`:
21
+ Para convertir una cantidad a palabras, simplemente hay que utilizar el método `to_s` de la clase `MontoEscrito::Decorador`:
22
22
 
23
- irb(main):001:0> MontoEscrito::Conversor.convertir(10)
23
+ irb(main):001:0> MontoEscrito::Decorador.new(10).to_s
24
24
  => "diez"
25
- irb(main):002:0> MontoEscrito::Conversor.convertir(14)
25
+ irb(main):002:0> MontoEscrito::Decorador.new(14).to_s
26
26
  => "catorce"
27
27
 
28
+ Esta forma permite interpolar las conversiones:
29
+
30
+ irb(main):001:0> monto = MontoEscrito::Decorador.new(10)
31
+ irb(main):002:0> "Son pesos #{monto}"
32
+ => "Son pesos diez"
33
+
28
34
  > **Nota:** actualmente se soportan sólamente números positivos menores a un cuatrillón. Puede extenderse fácilmente, pero a fines prácticos se deja en esa cantidad. Se arrojará un `ArgumentError` en caso de violar esa restricción de dominio.
29
35
 
30
36
  ## Contributing
@@ -34,3 +40,9 @@ Para convertir una cantidad a palabras, simplemente hay que utilizar el método
34
40
  3. Commit your changes (`git commit -am 'Add some feature'`)
35
41
  4. Push to the branch (`git push origin my-new-feature`)
36
42
  5. Create new Pull Request
43
+
44
+ ## Change Log
45
+
46
+
47
+ * `monto_escrito-1.0.0`: Se implementa una API basada en un objeto decorador, permitiendo interpolar llamadas.
48
+ * `monto_escrito-0.0.1`: Se utiliza la primera API que opera como helper
@@ -0,0 +1,136 @@
1
+ module MontoEscrito
2
+ class Decorador
3
+
4
+ def initialize(numero)
5
+ raise ArgumentError if numero >= 1_000_000_000_000_000_000_000_000 or numero < 0
6
+ @numero = numero
7
+ end
8
+
9
+ def to_s
10
+ @monto_escrito ||= calcular_monto_escrito
11
+ end
12
+
13
+ private
14
+
15
+ def calcular_monto_escrito
16
+
17
+ if casos_especiales[@numero]
18
+ monto_escrito = casos_especiales[@numero]
19
+ else
20
+
21
+ monto_escrito = ''
22
+
23
+ casos.each do |caso, detalles|
24
+ if @numero >= caso
25
+ valor = (@numero.to_i / detalles[:divisor]) * detalles[:multiplicador_primario]
26
+ monto_escrito += Decorador.new(valor).to_s + detalles[:sufijo]
27
+ @numero -= valor * detalles[:multiplicador_secundario]
28
+ if @numero > 0
29
+ monto_escrito += detalles[:continuacion]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ monto_escrito
35
+ end
36
+
37
+ def casos_especiales
38
+ {0 => 'cero', 1 => 'un', 2 => 'dos', 3 => 'tres', 4 => 'cuatro', 5 => 'cinco', 6 => 'seis', 7 => 'siete', 8 => 'ocho', 9 => 'nueve', 10 => 'diez', 11 => 'once', 12 => 'doce', 13 => 'trece', 14 => 'catorce', 15 => 'quince', 16 => 'dieciséis', 17 => 'diecisiete', 18 => 'dieciocho', 19 => 'diecinueve', 21 => 'veintiún', 22 => 'veintidós', 23 => 'veintitrés', 24 => 'veinticuatro', 25 => 'veinticinco', 26 => 'veintiséis', 27 => 'veintisiete', 28 => 'veintiocho', 29 => 'veintinueve', 10 => 'diez', 20 => 'veinte', 30 => 'treinta', 40 => 'cuarenta', 50 => 'cincuenta', 60 => 'sesenta', 70 => 'setenta', 80 => 'ochenta', 90 => 'noventa', 100 => 'cien', 200 => 'doscientos', 300 => 'trescientos', 400 => 'cuatrocientos', 500 => 'quinientos', 600 => 'seiscientos', 700 => 'setecientos', 800 => 'ochocientos', 900 => 'novecientos'}
39
+ end
40
+
41
+ def casos
42
+ {
43
+ 2_000_000_000_000_000_000 =>
44
+ {
45
+ :divisor => 1_000_000_000_000_000_000,
46
+ :multiplicador_primario => 1,
47
+ :multiplicador_secundario => 1_000_000_000_000_000_000,
48
+ :sufijo => ' trillones',
49
+ :continuacion => ' ',
50
+ },
51
+ 1_000_000_000_000_000_000 =>
52
+ {
53
+ :divisor => 1_000_000_000_000_000_000,
54
+ :multiplicador_primario => 1,
55
+ :multiplicador_secundario => 1_000_000_000_000_000_000,
56
+ :sufijo => ' trillón',
57
+ :continuacion => ' ',
58
+ },
59
+ 2_000_000_000_000 =>
60
+ {
61
+ :divisor => 1_000_000_000_000,
62
+ :multiplicador_primario => 1,
63
+ :multiplicador_secundario => 1_000_000_000_000,
64
+ :sufijo => ' billones',
65
+ :continuacion => ' ',
66
+ },
67
+ 1_000_000_000_000 =>
68
+ {
69
+ :divisor => 1_000_000_000_000,
70
+ :multiplicador_primario => 1,
71
+ :multiplicador_secundario => 1_000_000_000_000,
72
+ :sufijo => ' billón',
73
+ :continuacion => ' ',
74
+ },
75
+ 2_000_000 =>
76
+ {
77
+ :divisor => 1_000_000,
78
+ :multiplicador_primario => 1,
79
+ :multiplicador_secundario => 1_000_000,
80
+ :sufijo => ' millones',
81
+ :continuacion => ' ',
82
+ },
83
+ 1_000_000 =>
84
+ {
85
+ :divisor => 1_000_000,
86
+ :multiplicador_primario => 1,
87
+ :multiplicador_secundario => 1_000_000,
88
+ :sufijo => ' millón',
89
+ :continuacion => ' ',
90
+ },
91
+ 1_000 =>
92
+ {
93
+ :divisor => 1_000,
94
+ :multiplicador_primario => 1,
95
+ :multiplicador_secundario => 1_000,
96
+ :sufijo => ' mil',
97
+ :continuacion => ' ',
98
+ },
99
+ 200 =>
100
+ {
101
+ :divisor => 100,
102
+ :multiplicador_primario => 100,
103
+ :multiplicador_secundario => 1,
104
+ :sufijo => '',
105
+ :continuacion => ' ',
106
+ },
107
+ 100 =>
108
+ {
109
+ :divisor => 100,
110
+ :multiplicador_primario => 100,
111
+ :multiplicador_secundario => 1,
112
+ :sufijo => 'to',
113
+ :continuacion => ' ',
114
+ },
115
+ 30 =>
116
+ {
117
+ :divisor => 10,
118
+ :multiplicador_primario => 10,
119
+ :multiplicador_secundario => 1,
120
+ :sufijo => '',
121
+ :continuacion => ' y ',
122
+ },
123
+ 1 =>
124
+ {
125
+ :divisor => 1,
126
+ :multiplicador_primario => 1,
127
+ :multiplicador_secundario => 1,
128
+ :sufijo => '',
129
+ :continuacion => '',
130
+ }
131
+ }
132
+ end
133
+
134
+ end
135
+
136
+ end
@@ -1,3 +1,3 @@
1
1
  module MontoEscrito
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/monto_escrito.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "monto_escrito/version"
2
2
 
3
3
  module MontoEscrito
4
- require_relative "conversor"
4
+ require_relative "decorador"
5
5
  end
@@ -1,10 +1,10 @@
1
1
  require_relative "spec_helper"
2
- require File.expand_path("lib/monto_escrito/conversor.rb")
2
+ require File.expand_path("lib/monto_escrito/decorador.rb")
3
3
 
4
- describe MontoEscrito::Conversor do
4
+ describe MontoEscrito::Decorador do
5
5
 
6
6
  def convertir(numero)
7
- MontoEscrito::Conversor.convertir(numero)
7
+ MontoEscrito::Decorador.new(numero).to_s
8
8
  end
9
9
 
10
10
  def verificar_conversiones(numeros)
@@ -194,12 +194,12 @@ describe MontoEscrito::Conversor do
194
194
 
195
195
  it "no soporta cuatrillones" do
196
196
  numero = 1_000_000_000_000_000_000_000_000
197
- proc {MontoEscrito::Conversor.convertir(numero)}.must_raise(ArgumentError)
197
+ proc {MontoEscrito::Decorador.new(numero)}.must_raise(ArgumentError)
198
198
  end
199
199
 
200
200
  it "no soporta negativos" do
201
201
  numero = -1
202
- proc {MontoEscrito::Conversor.convertir(numero)}.must_raise(ArgumentError)
202
+ proc {MontoEscrito::Decorador.new(numero)}.must_raise(ArgumentError)
203
203
  end
204
204
 
205
205
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monto_escrito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Videla
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-05 00:00:00.000000000 Z
11
+ date: 2014-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -60,15 +60,16 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - .gitignore
63
+ - .ruby-version
63
64
  - Gemfile
64
65
  - LICENSE.txt
65
66
  - README.md
66
67
  - Rakefile
67
68
  - lib/monto_escrito.rb
68
- - lib/monto_escrito/conversor.rb
69
+ - lib/monto_escrito/decorador.rb
69
70
  - lib/monto_escrito/version.rb
70
71
  - monto_escrito.gemspec
71
- - spec/conversor_spec.rb
72
+ - spec/decorador_spec.rb
72
73
  - spec/spec_helper.rb
73
74
  homepage: https://github.com/wecodeio/monto_escrito
74
75
  licenses:
@@ -96,5 +97,5 @@ specification_version: 4
96
97
  summary: Esta gema expone un método para convertir a palabras un monto, utilizando
97
98
  el idioma español
98
99
  test_files:
99
- - spec/conversor_spec.rb
100
+ - spec/decorador_spec.rb
100
101
  - spec/spec_helper.rb
@@ -1,126 +0,0 @@
1
- module MontoEscrito
2
- class Conversor
3
-
4
- def self.convertir(numero)
5
-
6
- raise ArgumentError if numero >= 1_000_000_000_000_000_000_000_000 or numero < 0
7
-
8
- if @@casos_especiales[numero]
9
- monto_escrito = @@casos_especiales[numero]
10
- else
11
-
12
- monto_escrito = ''
13
-
14
- @@casos.each do |caso, detalles|
15
- if numero >= caso
16
- valor = (numero.to_i / detalles[:divisor]) * detalles[:multiplicador_primario]
17
- monto_escrito += convertir(valor) + detalles[:sufijo]
18
- numero -= valor * detalles[:multiplicador_secundario]
19
- if numero > 0
20
- monto_escrito += detalles[:continuacion]
21
- end
22
- end
23
- end
24
- end
25
- monto_escrito
26
- end
27
-
28
- private
29
-
30
- @@casos_especiales = { 0 => 'cero', 1 => 'un', 2 => 'dos', 3 => 'tres', 4 => 'cuatro', 5 => 'cinco', 6 => 'seis', 7 => 'siete', 8 => 'ocho', 9 => 'nueve', 10 => 'diez', 11 => 'once', 12 => 'doce', 13 => 'trece', 14 => 'catorce', 15 => 'quince', 16 => 'dieciséis', 17 => 'diecisiete', 18 => 'dieciocho', 19 => 'diecinueve', 21 => 'veintiún', 22 => 'veintidós', 23 => 'veintitrés', 24 => 'veinticuatro', 25 => 'veinticinco', 26 => 'veintiséis', 27 => 'veintisiete', 28 => 'veintiocho', 29 => 'veintinueve', 10 => 'diez', 20 => 'veinte', 30 => 'treinta', 40 => 'cuarenta', 50 => 'cincuenta', 60 => 'sesenta', 70 => 'setenta', 80 => 'ochenta', 90 => 'noventa', 100 => 'cien', 200 => 'doscientos', 300 => 'trescientos', 400 => 'cuatrocientos', 500 => 'quinientos', 600 => 'seiscientos', 700 => 'setecientos', 800 => 'ochocientos', 900 => 'novecientos'
31
- }
32
-
33
- @@casos = {
34
- 2_000_000_000_000_000_000 =>
35
- {
36
- :divisor => 1_000_000_000_000_000_000,
37
- :multiplicador_primario => 1,
38
- :multiplicador_secundario => 1_000_000_000_000_000_000,
39
- :sufijo => ' trillones',
40
- :continuacion => ' ',
41
- },
42
- 1_000_000_000_000_000_000 =>
43
- {
44
- :divisor => 1_000_000_000_000_000_000,
45
- :multiplicador_primario => 1,
46
- :multiplicador_secundario => 1_000_000_000_000_000_000,
47
- :sufijo => ' trillón',
48
- :continuacion => ' ',
49
- },
50
- 2_000_000_000_000 =>
51
- {
52
- :divisor => 1_000_000_000_000,
53
- :multiplicador_primario => 1,
54
- :multiplicador_secundario => 1_000_000_000_000,
55
- :sufijo => ' billones',
56
- :continuacion => ' ',
57
- },
58
- 1_000_000_000_000 =>
59
- {
60
- :divisor => 1_000_000_000_000,
61
- :multiplicador_primario => 1,
62
- :multiplicador_secundario => 1_000_000_000_000,
63
- :sufijo => ' billón',
64
- :continuacion => ' ',
65
- },
66
- 2_000_000 =>
67
- {
68
- :divisor => 1_000_000,
69
- :multiplicador_primario => 1,
70
- :multiplicador_secundario => 1_000_000,
71
- :sufijo => ' millones',
72
- :continuacion => ' ',
73
- },
74
- 1_000_000 =>
75
- {
76
- :divisor => 1_000_000,
77
- :multiplicador_primario => 1,
78
- :multiplicador_secundario => 1_000_000,
79
- :sufijo => ' millón',
80
- :continuacion => ' ',
81
- },
82
- 1_000 =>
83
- {
84
- :divisor => 1_000,
85
- :multiplicador_primario => 1,
86
- :multiplicador_secundario => 1_000,
87
- :sufijo => ' mil',
88
- :continuacion => ' ',
89
- },
90
- 200 =>
91
- {
92
- :divisor => 100,
93
- :multiplicador_primario => 100,
94
- :multiplicador_secundario => 1,
95
- :sufijo => '',
96
- :continuacion => ' ',
97
- },
98
- 100 =>
99
- {
100
- :divisor => 100,
101
- :multiplicador_primario => 100,
102
- :multiplicador_secundario => 1,
103
- :sufijo => 'to',
104
- :continuacion => ' ',
105
- },
106
- 30 =>
107
- {
108
- :divisor => 10,
109
- :multiplicador_primario => 10,
110
- :multiplicador_secundario => 1,
111
- :sufijo => '',
112
- :continuacion => ' y ',
113
- },
114
- 1 =>
115
- {
116
- :divisor => 1,
117
- :multiplicador_primario => 1,
118
- :multiplicador_secundario => 1,
119
- :sufijo => '',
120
- :continuacion => '',
121
- }
122
- }
123
-
124
- end
125
-
126
- end