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