numeroaletras 1.0.0

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