Module: PolishNumber

Defined in:
lib/polish_number.rb

Constant Summary collapse

TRANSLATIONS =
{
  0 => 'zero',
  1 => 'jeden',
  2 => 'dwa',
  3 => 'trzy',
  4 => 'cztery',
  5 => 'pięć',
  7 => 'siedem',
  6 => 'sześć',
  8 => 'osiem',
  9 => 'dziewięć',
  10 => 'dziesięć',
  11 => 'jedenaście',
  12 => 'dwanaście',
  13 => 'trzynaście',
  14 => 'czternaście',
  15 => 'piętnaście',
  16 => 'szesnaście',
  17 => 'siedemnaście',
  18 => 'osiemnaście',
  19 => 'dziewiętnaście',
  20 => 'dwadzieścia',
  30 => 'trzydzieści',
  40 => 'czterdzieści',
  50 => 'pięćdziesiąt',
  60 => 'sześćdziesiąt',
  70 => 'siedemdziesiąt',
  80 => 'osiemdziesiąt',
  90 => 'dziewięćdziesiąt',
  100 => 'sto',
  200 => 'dwieście',
  300 => 'trzysta',
  400 => 'czterysta',
  500 => 'pięćset',
  600 => 'sześćset',
  700 => 'siedemset',
  800 => 'osiemset',
  900 => 'dziewięćset',
  1000 => 'tysiąc'
}.freeze
THOUSANDS =
rehash({
  '1' => 'tysiąc',
  '2_3_4' => 'tysiące', # 22..24, 32..34
  '5' => 'tysięcy', # 0, 5..21, 25..31
})

Class Method Summary collapse

Class Method Details

.rehash(hash) ⇒ Object



45
46
47
48
49
50
# File 'lib/polish_number.rb', line 45

def self.rehash(hash)
  result = Hash.new(hash['5'])
  result[0] = hash['5']
  result[1] = hash['1']
  result[2] = result[3] = result[4] = hash['2_3_4']
end

.translate(number) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/polish_number.rb', line 111

def self.translate(number)
  number = number.to_i
  case number
  when 0..19
    return translate_0_19(number)
  when 20..99
    return translate_20_99(number)
  when 100..999
    return translate_100_999(number)
  when 1000..9999
    return translate_1000_9999(number)
  end
end

.translate_0_19(number) ⇒ Object



58
59
60
# File 'lib/polish_number.rb', line 58

def self.translate_0_19(number)
  TRANSLATIONS[number]
end

.translate_0_99(number) ⇒ Object



69
70
71
# File 'lib/polish_number.rb', line 69

def self.translate_0_99(number)
  number < 20 ? translate_0_19(number) : translate_20_99(number)
end

.translate_0_999(number) ⇒ Object



88
89
90
# File 'lib/polish_number.rb', line 88

def self.translate_0_999(number)
  number < 100 ? translate_0_99(number) : translate_100_999(number)
end

.translate_1000_9999(number) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/polish_number.rb', line 92

def self.translate_1000_9999(number)
  return TRANSLATIONS[number] if TRANSLATIONS.has_key? number

  translations = []

  thousands = number/1000
  if thousands == 1
    translations << TRANSLATIONS[1000]
  else
    translations << "#{translate_100_999(number)} #{pluralize(thousands, THOUSANDS)}"
  end

  number %= 1000
  hundreds = number/100
  translations << translate_0_999(number)

  translations.join(' ')
end

.translate_100_999(number) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/polish_number.rb', line 73

def self.translate_100_999(number)
  return TRANSLATIONS[number] if TRANSLATIONS.has_key? number

  hundreds = number/100
  translations = []
  translations << TRANSLATIONS[hundreds*100]

  tens_units = number%100
  if tens_units > 0
    translations << translate_0_99(tens_units)
  end

  translations.join(' ')
end

.translate_20_99(number) ⇒ Object



62
63
64
65
66
67
# File 'lib/polish_number.rb', line 62

def self.translate_20_99(number)
  return TRANSLATIONS[number] if TRANSLATIONS.has_key? number

  first, second = number.to_s.split(//).map { |c| c.to_i }
  "#{TRANSLATIONS[first*10]} #{TRANSLATIONS[second]}"
end

.translate_3_digit_number(number) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/polish_number.rb', line 125

def self.translate_3_digit_number(number)
  unless (0..999) === number
    raise "#{number} not supported"
  end

  # handle simple numbers
  if TRANSLATIONS.has_key? number
    return TRANSLATIONS[number]
  end

  number_digits = number.to_s.split(//)

  last_2_digits =
  if number > 99
    number_digits[-2, 2]
  else
    number_digits
  end

  last_2_digits = last_2_digits.join.to_i
  last_2_translation = TRANSLATIONS[last_2_digits]

  translation_digits = []

  if last_2_translation
    translation_digits.unshift last_2_digits
    number /= 100
    position = 2
  else
    position = 0
  end

  while number != 0
    digit = number%10
    if digit > 0
      power = 10**position
      translation_digits.unshift digit*power
    end
    number /= 10
    position += 1
  end

  translation_digits
end