Module: BCD

Defined in:
lib/bcd.rb

Overview

Methods to translate to and from binary coded decimal

Author

Dafydd Crosby <[email protected]>

Copyright

Copyright 2013, Dafydd Crosby

License

BSD 2-clause

Class Method Summary collapse

Class Method Details

.decode(bcd) ⇒ Object

Translates binary coded decimal into an integer

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/bcd.rb', line 9

def self.decode(bcd)
  raise ArgumentError, 'Argument is not numeric' unless bcd.is_a? Numeric
  raise ArgumentError, 'Cannot be a negative integer' if bcd < 0

  binstring = ''
  while true do
    q, r = bcd.divmod(10)
    nibble = r.to_s(2)
    while nibble.length < 4 do
      nibble.prepend('0')
    end
    binstring.prepend(nibble)
    q == 0 ? break : bcd = q
  end

  binstring.to_i(2)
end

.encode(int) ⇒ Object

Translate an integer into binary coded decimal

Raises:

  • (ArgumentError)


28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/bcd.rb', line 28

def self.encode(int)
  raise ArgumentError, 'Argument is not numeric' unless int.is_a? Numeric
  raise ArgumentError, 'Cannot be a negative integer' if int < 0

  bcdstring = ''
  while int > 0 do
    nibble = int % 16
    bcdstring.prepend(nibble.to_s)
    int >>= 4
  end
  bcdstring.to_i
end