Sha256: d74b319d1c767466dd839aa5784972d2174fbd54ba3b10aab58b5f7cedd96cbe

Contents?: true

Size: 680 Bytes

Versions: 6

Compression:

Stored size: 680 Bytes

Contents

# frozen_string_literal: true

class CusipValidator < BaseValidator

  REGEXP = /^[0-9A-Z]{9}$/

  private

  def valid_attr?
    valid_regexp? && valid_checksum?
  end

  # rubocop:disable Metrics/AbcSize
  def valid_checksum?
    digits = value.chars.map { |chr| /[A-Z]/.match?(chr) ? (chr.ord - 55) : chr.to_i }

    even_values = digits.values_at(*digits.each_index.select(&:even?))
    odd_values = digits.values_at(*digits.each_index.select(&:odd?))

    values = odd_values.map { |int| int * 2 }.zip(even_values).flatten
    values = values.inject(0) { |sum, int| sum + (int / 10) + (int % 10) }

    ((10 - values) % 10) % 10
  end
  # rubocop:enable Metrics/AbcSize

end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
lite-validators-1.7.2 lib/lite/validators/cusip_validator.rb
lite-validators-1.7.1 lib/lite/validators/cusip_validator.rb
lite-validators-1.7.0 lib/lite/validators/cusip_validator.rb
lite-validators-1.6.0 lib/lite/validators/cusip_validator.rb
lite-validators-1.5.0 lib/lite/validators/cusip_validator.rb
lite-validators-1.4.0 lib/lite/validators/cusip_validator.rb