Class: Respanol::Numero

Inherits:
Object
  • Object
show all
Defined in:
lib/respanol/numero.rb

Direct Known Subclasses

FemininoNumero

Constant Summary collapse

UNIDADES =
%w( cero uno dos tres cuatro cinco seis siete ocho nueve )
DECENA =
%w( diez once doce trece catorce quince dieciseis diecisiete dieciocho diecinueve )
DECENAS =
%w[ diez viente treinta cuarenta cincuenta sesenta setenta ochenta noventa ].unshift('')
CENTENARES =
%w[ ciento doscientos trescientos cuatrocientos quinientos seiscientos setecientos ochocientos novecientos ].unshift('')
UNO_APOCOPE =
'un'
MILLONS =
%w[ millon billon trillon cuatrillon quintillon sextillon septillon octillon nonillon decillon undecillon duodecillon tredecillon cuatordecillon quindecillon sexdecillon septendecillon octodecillon novendecillon vigintillon ].unshift('')
UNIDAD_1K =
'mil'
DECIMAL =
'coma'

Class Method Summary collapse

Class Method Details

.dos_ultimos_en_palabras(num, es_unidad = true) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/respanol/numero.rb', line 66

def self.dos_ultimos_en_palabras(num, es_unidad = true)
  ultimos_2 = num % 100
  ultimo = ultimos_2 % 10
  case ultimos_2 / 10
  when 2
    ultimo == 0 ? DECENAS[2] : "vienti#{unidad(ultimo, es_unidad)}"
  when 1
    DECENA[ultimo]
  else
    s = "#{DECENAS[ultimos_2 / 10]}"
    s = s + "#{' y ' if (ultimos_2 / 10 >= 3)}#{unidad(ultimo, es_unidad)}" if ultimo > 0
    s
  end
end

.femininoObject



12
13
14
# File 'lib/respanol/numero.rb', line 12

def self.feminino
  FemininoNumero
end

.millon_en_palabras(numero, es_unidad = true) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/respanol/numero.rb', line 46

def self.millon_en_palabras(numero, es_unidad = true)
  num = numero % 1_000_000

  s_ultimos_3 = tres_ultimos_en_palabras(num, es_unidad)

  if num >= 1000
    mil = (num % 1_000_000) / 1000
    s_mil = case mil
            when 0
              ''
            when 1
              UNIDAD_1K
            else
              "#{tres_ultimos_en_palabras(mil, false)} #{UNIDAD_1K}"
            end
  end

  unirse_palabras(s_mil, s_ultimos_3)
end

.numero_en_palabras(numero) ⇒ Object



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
# File 'lib/respanol/numero.rb', line 20

def self.numero_en_palabras(numero)
  return self::UNIDADES[0] if numero == 0

  num = numero
  millons = []
  s_millons = []
  es_unidad = true
  i_millon = 0
  loop do
    # Obteno el millone
    millon = num % 1_000_000
    millons.push millon
    # Escribo el millone
    s_millons.push("#{MILLONS[i_millon]}#{'es' if millon > 1}") if !es_unidad && millon >= 1
    s_millons.push millon_en_palabras(millon, es_unidad)
    # Preparo a continuacion
    es_unidad = false
    i_millon += 1
    num = num / 1_000_000

    break if num == 0
  end

  unirse_palabras(s_millons.reverse)
end

.tres_ultimos_en_palabras(num, es_unidad = true) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/respanol/numero.rb', line 81

def self.tres_ultimos_en_palabras(num, es_unidad = true)
  return 'cien' if (num % 1000) == 100

  s_ultimos_2 = dos_ultimos_en_palabras(num, es_unidad)
  s_centenar = self::CENTENARES[(num % 1000) / 100] if num >= 100
  unirse_palabras(s_centenar, s_ultimos_2)
end

.unidad(num, es_unidad = true) ⇒ Object



89
90
91
92
93
94
# File 'lib/respanol/numero.rb', line 89

def self.unidad(num, es_unidad = true)
  ultimo = num % 10
  return self::UNO_APOCOPE if !es_unidad && ultimo == 1

  self::UNIDADES[ultimo]
end

.unirse_palabras(*ps) ⇒ Object



16
17
18
# File 'lib/respanol/numero.rb', line 16

def self.unirse_palabras(*ps)
  ps.flatten.join(' ').gsub(/\s+/, ' ').strip
end