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