class SecId::ISIN

en.wikipedia.org/wiki/International_Securities_Identification_Number

Constants

ID_REGEX

Attributes

country_code[R]
nsin[R]

Public Class Methods

new(isin) click to toggle source
# File lib/sec_id/isin.rb, line 15
def initialize(isin)
  isin_parts = parse isin
  @identifier = isin_parts[:identifier]
  @country_code = isin_parts[:country_code]
  @nsin = isin_parts[:nsin]
  @check_digit = isin_parts[:check_digit]&.to_i
end

Public Instance Methods

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

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

Private Instance Methods

id_digits() click to toggle source
# File lib/sec_id/isin.rb, line 44
def id_digits
  @id_digits ||= identifier.each_char.flat_map(&method(:char_to_digits))
end
luhn_sum() click to toggle source

en.wikipedia.org/wiki/Luhn_algorithm

# File lib/sec_id/isin.rb, line 32
def luhn_sum
  sum = 0

  id_digits.reverse.each_slice(2) do |even, odd|
    double_even = (even || 0) * 2
    double_even -= 9 if double_even > 9
    sum += double_even + (odd || 0)
  end

  sum
end