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 +4 -4
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/README.md +15 -3
- data/lib/monto_escrito/decorador.rb +136 -0
- data/lib/monto_escrito/version.rb +1 -1
- data/lib/monto_escrito.rb +1 -1
- data/spec/{conversor_spec.rb → decorador_spec.rb} +5 -5
- metadata +6 -5
- data/lib/monto_escrito/conversor.rb +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 531120575aa60bf6128ea3723d8842c96325d3f8
|
4
|
+
data.tar.gz: 248577fa1223229137313d453bc3805ebe3c56c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8857dc09ff77ebf98104032fe500b0f188a691b12eb72a6b137f84dc561771ae5ad56fb4d46170f0fd492ac5dc9855cb9e6703e9cb23e8c0467c7c99680d95d
|
7
|
+
data.tar.gz: ab2cc0b51f32b7b8c0cf9c5f7d4e4d273ff0061c7c2817a5921ddcf0ac10cae20c0d5f60065354e4625335df6b730853df0e4a249e2188ff51def2635b13ddc5
|
data/.gitignore
CHANGED
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 `
|
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::
|
23
|
+
irb(main):001:0> MontoEscrito::Decorador.new(10).to_s
|
24
24
|
=> "diez"
|
25
|
-
irb(main):002:0> MontoEscrito::
|
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
|
data/lib/monto_escrito.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative "spec_helper"
|
2
|
-
require File.expand_path("lib/monto_escrito/
|
2
|
+
require File.expand_path("lib/monto_escrito/decorador.rb")
|
3
3
|
|
4
|
-
describe MontoEscrito::
|
4
|
+
describe MontoEscrito::Decorador do
|
5
5
|
|
6
6
|
def convertir(numero)
|
7
|
-
MontoEscrito::
|
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::
|
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::
|
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
|
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-
|
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/
|
69
|
+
- lib/monto_escrito/decorador.rb
|
69
70
|
- lib/monto_escrito/version.rb
|
70
71
|
- monto_escrito.gemspec
|
71
|
-
- spec/
|
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/
|
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
|