class SecId::CUSIP

en.wikipedia.org/wiki/CUSIP

Constants

ID_REGEX

Attributes

cusip6[R]
issue[R]

Public Class Methods

new(cusip) click to toggle source
# File lib/sec_id/cusip.rb, line 15
def initialize(cusip)
  cusip_parts = parse cusip
  @identifier = cusip_parts[:identifier]
  @cusip6 = cusip_parts[:cusip6]
  @issue = cusip_parts[:issue]
  @check_digit = cusip_parts[:check_digit]&.to_i
end

Public Instance Methods

calculate_check_digit() click to toggle source
# File lib/sec_id/cusip.rb, line 23
def calculate_check_digit
  return mod_10(modified_luhn_sum) if valid_format?

  raise InvalidFormatError, "CUSIP '#{full_number}' is invalid and check-digit cannot be calculated!"
end

Private Instance Methods

id_digits() click to toggle source
# File lib/sec_id/cusip.rb, line 43
def id_digits
  @id_digits ||= identifier.each_char.map(&method(:char_to_digit))
end
modified_luhn_sum() click to toggle source

en.wikipedia.org/wiki/Luhn_algorithm

# File lib/sec_id/cusip.rb, line 32
def modified_luhn_sum
  sum = 0

  id_digits.reverse.each_slice(2) do |even, odd|
    double_even = (even || 0) * 2
    sum += div_10_mod_10(double_even) + div_10_mod_10(odd || 0)
  end

  sum
end