module PolishNumber
Constants
- CURRENCIES
- HUNDREDS
- MILLIONS
- TEENS
- TENS
- THOUSANDS
- UNITIES
- VERSION
- ZERO
Public Class Methods
translate(number, options={})
click to toggle source
# File lib/polish_number.rb, line 28 def self.translate(number, options={}) if options[:currency] && !CURRENCIES.has_key?(options[:currency]) raise ArgumentError, "unknown :currency option '#{options[:currency].inspect}'. Choose one from: #{CURRENCIES.inspect}" end number = number.to_i unless (0..999999999).include? number raise ArgumentError, 'number should be in 0..999999999 range' end if number == 0 result = ZERO.dup else formatted_number = sprintf('%09.0f', number) digits = formatted_number.chars.map { |char| char.to_i } result = '' result << process_0_999(digits[0..2]) result << millions(number/1000000, digits[0..2]) result << ' ' result << process_0_999(digits[3..5]) result << thousands(number/1000, digits[3..5]) result << ' ' result << process_0_999(digits[6..9]) result.strip! end if options[:currency] currency = CURRENCIES[options[:currency]] result << ' ' result << currency[classify(number, digits)] end result end
Private Class Methods
classify(number, digits)
click to toggle source
# File lib/polish_number.rb, line 97 def self.classify(number, digits) if number == 1 :one # all numbers with 2, 3 or 4 at the end, but not teens elsif digits && (2..4).include?(digits[-1]) && digits[-2] != 1 :few else :many end end
millions(number, digits)
click to toggle source
# File lib/polish_number.rb, line 89 def self.millions(number, digits) if number == 0 '' else MILLIONS[classify(number, digits)] end end
process_0_999(digits)
click to toggle source
# File lib/polish_number.rb, line 67 def self.process_0_999(digits) result = '' result << HUNDREDS[digits[0]] if digits[1] == 1 && digits[2] != 0 result << TEENS[digits[2]] else result << TENS[digits[1]] result << UNITIES[digits[2]] end result end
thousands(number, digits)
click to toggle source
# File lib/polish_number.rb, line 81 def self.thousands(number, digits) if number == 0 '' else THOUSANDS[classify(number, digits)] end end