1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| def numero_a_palabras(numero)
de_tres_en_tres = numero.to_i.to_s.reverse.scan(/\d{1,3}/).map{|n| n.reverse.to_i}
millones = [
{true => nil, false => nil},
{true => 'millón', false => 'millones'},
{true => "billón", false => "billones"},
{true => "trillón", false => "trillones"}
]
centena_anterior = 0
contador = -1
palabras = de_tres_en_tres.map do |numeros|
contador += 1
if contador%2 == 0
centena_anterior = numeros
[centena_a_palabras(numeros), millones[contador/2][numeros==1]].compact if numeros > 0
elsif centena_anterior == 0
[centena_a_palabras(numeros), "mil", millones[contador/2][false]].compact if numeros > 0
else
[centena_a_palabras(numeros), "mil"] if numeros > 0
end
end
palabras.compact.reverse.join(' ')
end
def centena_a_palabras(numero)
especiales = {
11 => 'once', 12 => 'doce', 13 => 'trece', 14 => 'catorce', 15 => 'quince',
10 => 'diez', 20 => 'veinte', 100 => 'cien'
}
if especiales.has_key?(numero)
return especiales[numero]
end
centenas = [nil, 'ciento', 'doscientos', 'trescientos', 'cuatrocientos', 'quinientos', 'seiscientos', 'setecientos', 'ochocientos', 'novecientos']
decenas = [nil, 'dieci', 'veinti', 'treinta', 'cuarenta', 'cincuenta', 'sesenta', 'setenta', 'ochenta', 'noventa']
unidades = [nil, 'un', 'dos', 'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve']
centena, decena, unidad = numero.to_s.rjust(3,'0').scan(/\d/).map{|i| i.to_i}
palabras = []
palabras < < centenas[centena]
if especiales.has_key?(decena*10 + unidad)
palabras << especiales[decena*10 + unidad]
else
tmp = "#{decenas[decena]}#{' y ' if decena > 2 && unidad > 0}#{unidades[unidad]}"
palabras < < (tmp.blank? ? nil : tmp)
end
palabras.compact.join(' ')
end |
Comentarios recientes