Sha256: 4c31577d432a391342174c5565f719322afa2f58bb8779abedb27ba750c4ef52

Contents?: true

Size: 1.06 KB

Versions: 1

Compression:

Stored size: 1.06 KB

Contents

# frozen_string_literal: true

# Methods to translate to and from binary coded decimal
#
# Author:: David Crosby <dafydd@dafyddcrosby.com>
# Copyright:: Copyright 2013-2022 David Crosby
# License:: BSD 2-clause

module BCD
  # Translates binary coded decimal into an integer
  def self.decode(bcd)
    raise ArgumentError, 'Argument is not numeric' unless bcd.is_a? Numeric
    raise ArgumentError, 'Cannot be a negative integer' if bcd.negative?

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

    binstring.to_i(2)
  end

  # Translate an integer into binary coded decimal
  def self.encode(int)
    raise ArgumentError, 'Argument is not numeric' unless int.is_a? Numeric
    raise ArgumentError, 'Cannot be a negative integer' if int.negative?

    bcdstring = String.new
    while int.positive?
      nibble = int % 16
      bcdstring.prepend(nibble.to_s)
      int >>= 4
    end
    bcdstring.to_i
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bcd-1.0.1 lib/bcd.rb