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
- .rehash(hash) ⇒ Object
- .translate(number) ⇒ Object
- .translate_0_19(number) ⇒ Object
- .translate_0_99(number) ⇒ Object
- .translate_0_999(number) ⇒ Object
- .translate_1000_9999(number) ⇒ Object
- .translate_100_999(number) ⇒ Object
- .translate_20_99(number) ⇒ Object
- .translate_3_digit_number(number) ⇒ Object
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 |