numeroaletras 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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/numeroaletras.rb +120 -0
  3. metadata +43 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1521e1baa981f540f3efbb812d28ae66eb4d6e7a
4
+ data.tar.gz: a14ee3bb674229b232ec717f1eaf5abb3e8bd0cd
5
+ SHA512:
6
+ metadata.gz: d7e1060444058b6a7a0b11ffdbda1faeb75130a8443007e3b8a87b685c37a84638e5ba9eccc42ff514a54ce80c0b109fcc080e27bf8365e0cb8b930b6ae1417f
7
+ data.tar.gz: 7a7a8345ea3c1a8db3d4fffc0568ab4f3894066dcfc25138a596d4787265e98ae1f4c06cffb75646f7a1ee1fd0e116d89e46c6c4f6a98c4a327f1caf30858604
@@ -0,0 +1,120 @@
1
+ module NumeroALetras
2
+ module Numeric
3
+ def self.included(recipiente)
4
+ recipiente.extend(ClassMethods)
5
+ recipiente.class_eval do
6
+ include InstanceMethods
7
+ end
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ end
13
+
14
+ module InstanceMethods
15
+ MONEDA_SINGULAR = 'bolivar'
16
+ MONEDA_PLURAL = 'bolivares'
17
+ CENTIMOS_SINGULAR = 'centimo'
18
+ CENTIMOS_PLURAL = 'centimos'
19
+ MAX_NUMERO = 999_999_999_999
20
+ UNIDADES = %w(cero uno dos tres cuatro cinco seis siete ocho nueve)
21
+ DECENAS = %w(diez once doce trece catorce quince dieciseis diecisiete dieciocho diecinueve)
22
+ DIEZ_DIEZ = %w(cero diez veinte treinta cuarenta cincuenta sesenta setenta ochenta noventa)
23
+ CIENTOS = %w(_ ciento doscientos trescientos cuatroscientos quinientos seiscientos setecientos ochocientos novecientos)
24
+
25
+ def a_letras
26
+ numero_entero = self.to_i
27
+ raise 'Rango soportado actualmente: [- +]999.999.999.999' if numero_entero > MAX_NUMERO
28
+
29
+ return 'menos ' + self.abs.a_letras if numero_entero < 0
30
+
31
+ parte_decimal = ((self.abs - numero_entero.abs) * 100).round
32
+ if(parte_decimal > 9)
33
+ letras_decimal = self.kind_of?(Float) ? " punto #{parte_decimal.a_letras}" : ''
34
+ else
35
+ letras_decimal = self.kind_of?(Float) ? " punto cero #{parte_decimal.a_letras}" : ''
36
+ end
37
+
38
+ case numero_entero
39
+ when 0..99 then leer_decenas(numero_entero)
40
+ when 100..999 then leer_centenas(numero_entero)
41
+ when 1000..999999 then leer_miles(numero_entero)
42
+ when 1000000..999999999 then leer_millones(numero_entero)
43
+ when 1000000000..999999999999 then leer_millardos(numero_entero)
44
+ end.gsub('_', ' ').squeeze(' ').strip.gsub('uno mil', 'un mil') + letras_decimal
45
+ end
46
+
47
+ def a_moneda
48
+ numero_entero = self.to_i
49
+
50
+ parte_decimal = ((self.abs - numero_entero.abs) * 100).round
51
+
52
+ centimos = (parte_decimal == 1) ? CENTIMOS_SINGULAR : CENTIMOS_PLURAL
53
+ moneda = (numero_entero == 1) ? MONEDA_SINGULAR : MONEDA_PLURAL
54
+
55
+ letras = numero_entero.a_letras.gsub('uno', 'un')
56
+ letras += ' de' if (letras =~ /(millon|millones)\z/)
57
+
58
+ letras_decimal = " con #{parte_decimal.a_letras.gsub('uno', 'un')} #{centimos}" if self.kind_of?(Float)
59
+
60
+ "#{letras} #{moneda}#{letras_decimal}"
61
+ end
62
+
63
+ def leer_decenas(numero)
64
+ numero_entero = numero.to_i
65
+ return UNIDADES[numero_entero] if numero_entero < 10
66
+ decena, unidad = numero_entero.divmod(10)
67
+ case numero_entero
68
+ when 10..19, 0 then DECENAS[unidad]
69
+ when 21..29 then "veinti#{UNIDADES[unidad]}"
70
+ else DIEZ_DIEZ[decena] + (unidad > 0 ? " y #{UNIDADES[unidad]}" : '')
71
+ end
72
+ end
73
+
74
+ def leer_centenas(numero)
75
+ numero_entero = numero.to_i
76
+ centena, decena = numero_entero.divmod(100)
77
+ return 'cien' if numero_entero == 100
78
+ CIENTOS[centena] + (decena > 0 ? " #{leer_decenas(decena)}" : '')
79
+ end
80
+
81
+ def leer_miles(numero)
82
+ numero_entero = numero.to_i
83
+ millar, centena = numero_entero.divmod(1000)
84
+ millar_letras = case millar
85
+ when 2..9 then UNIDADES[millar]
86
+ when 10..99 then leer_decenas(millar)
87
+ when 100..999 then leer_centenas(millar)
88
+ else ''
89
+ end + ' mil '
90
+ millar_letras += leer_centenas(centena) if centena > 0
91
+ millar_letras
92
+ end
93
+
94
+ def leer_millones(numero)
95
+ numero_entero = numero.to_i
96
+ millon, millar = numero_entero.divmod(1000000)
97
+ millon_letras = case millon
98
+ when 1 then ' un millon '
99
+ when 2..9 then UNIDADES[millon]
100
+ when 10..99 then leer_decenas(millon)
101
+ when 100..999 then leer_centenas(millon)
102
+ else ''
103
+ end
104
+ millon_letras += ' millones ' unless millon == 1
105
+ millon_letras + case millar
106
+ when 1..999 then leer_centenas(millar)
107
+ when 1000..999999 then leer_miles(millar)
108
+ else ''
109
+ end
110
+ end
111
+
112
+ def leer_millardos(numero)
113
+ numero_entero = numero.to_i
114
+ millardo, millon = numero_entero.divmod(1000000)
115
+ "#{leer_miles(millardo)} #{leer_millones(millon)}"
116
+ end
117
+ end
118
+ end
119
+
120
+ Numeric.send :include, NumeroALetras::Numeric
metadata ADDED
@@ -0,0 +1,43 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: numeroaletras
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Efren Fuentes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Esta gema permite convertir un numero en letras
14
+ email: efrenfuentes#gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/numeroaletras.rb
20
+ homepage: https://github.com/efrenfuentes
21
+ licenses: []
22
+ metadata: {}
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ required_rubygems_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ requirements: []
38
+ rubyforge_project:
39
+ rubygems_version: 2.1.4
40
+ signing_key:
41
+ specification_version: 4
42
+ summary: Convierte un numero en letras
43
+ test_files: []