Class: IntegerToEnglish::Converter

Inherits:
Object
  • Object
show all
Defined in:
lib/integer_to_english.rb

Instance Method Summary collapse

Constructor Details

#initializeConverter

Returns a new instance of Converter.



13
14
15
16
17
18
# File 'lib/integer_to_english.rb', line 13

def initialize
  @singles   = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
  @tens      = ['', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
  @ten_frags = ['', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
  @scale     = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion'] # can be extended further
end

Instance Method Details

#to_text(number, version = :gb) ⇒ String

Version can be :gb or :uk for British or :us for USA “and” word will be used accordingly

Parameters:

  • number (String|Integer)
  • version (Symbol) (defaults to: :gb)

Returns:

  • (String)


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/integer_to_english.rb', line 26

def to_text(number, version = :gb)
  unless number.is_a?(String) || number.is_a?(Integer)
    raise ArgumentError.new 'Only Integer or String (that converts to integer) can be parsed'
  end

  version = version.to_sym if version.is_a? String
  unless [:uk, :gb, :us].include? version
    raise ArgumentError.new 'Only :uk, :gb or :us versions can be generated'
  end

  number = number.to_s if number.is_a? Integer
  number.strip!

  # strip prefix
  number[0] = '' if number[0] == '+' or number[0] == '-'

  # 0
  return 'zero' if number.length == 1 and number == '0'

  # 1..999
  return get_hundreds number, version if number.length < 4

  # 999 <
  i             = 0
  portions      = []
  portion_block = []
  number.reverse!

  number.each_char do |c|
    portion_block.push c
    i += 1

    if i % 3 == 0
      block_clone = portion_block.clone
      portions.push block_clone
      portion_block.clear
      i = 0
    end
  end

  portions.push portion_block unless portion_block.empty?
  portions.reverse!

  final_number = ''
  i            = portions.length - 1
  portions.each do |p|
    p.reverse!
    p_in_text    = get_hundreds(p.join.to_i.to_s, version)
    final_number += p_in_text
    final_number += ' ' + @scale[i] + ' ' if p_in_text != ''
    i            -= 1
  end
  final_number.strip!
end