module Paisa

Constants

ONES
SYMBOL
TENS
VERSION

Public Class Methods

format(paise, precision: 2) click to toggle source
# File lib/paisa.rb, line 36
def self.format(paise, precision: 2)
  rupee_parts, paise_part = parse(paise)
  [
    rupee_parts.join(',').rjust(1, '0'),
    paise_part.rjust(2, '0').slice(0, precision)
  ].reject(&:empty?).join('.')
end
format_with_sym(paise, precision: 2) click to toggle source
# File lib/paisa.rb, line 44
def self.format_with_sym(paise, precision: 2)
  [SYMBOL, format(paise, precision: precision)].join
end
words(paise) click to toggle source
# File lib/paisa.rb, line 48
def self.words(paise)
  rupee_parts, paise_part = parse(paise)
  rupee_text_parts = rupee_parts.reverse.each_with_object([]) do |section, memo|
    label = ['', ' thousand', ' lakh', ' crore'][memo.size]
    memo << if section.to_i.zero?
              nil
            else
              [to_words(section), label].join
            end
  end
  text = []
  text << [rupee_text_parts.to_a.compact.reverse.join(', '), 'rupees'].join(' ') unless rupee_text_parts.empty?
  text << [to_words(paise_part), 'paise'].join(' ') unless paise_part.to_i.zero?
  text.join(', ')
end

Private Class Methods

parse(paise) click to toggle source
# File lib/paisa.rb, line 64
def self.parse(paise)
  little_endian = paise.to_s.reverse.chars
  paise_part = little_endian.shift(2).reverse.join
  rupee_parts = []
  cycle = [3, 2, 2].cycle
  until little_endian.empty?
    rupee_parts.unshift(little_endian.shift(cycle.next).reverse.join)
  end
  [rupee_parts, paise_part]
end
tens_hash(tens_name) click to toggle source
# File lib/paisa.rb, line 12
def self.tens_hash(tens_name)
  Hash.new do |_, k|
    [tens_name, ONES[k]].compact.join(' ')
  end
end
to_words(section) click to toggle source
# File lib/paisa.rb, line 76
def self.to_words(section)
  digits = section.chars.map(&:to_i)
  case digits.size
  when 1
    ONES.dig(*digits)
  when 2
    TENS.dig(*digits)
  when 3
    parts = []
    parts << [ONES[digits[0]], 'hundred'].join(' ')
    parts << TENS.dig(*digits.slice(1, 2)) unless digits.slice(1, 2).all?(&:zero?)
    parts.join(' and ')
  else
    # do nothing
  end
end