Sha256: 5a2c9764587d130df94b79837f04f41ee40e129929d96d1655af729aa543b285

Contents?: true

Size: 1.46 KB

Versions: 8

Compression:

Stored size: 1.46 KB

Contents

module Ibandit
  module CheckDigit
    def self.iban(country_code, bban)
      chars = bban + country_code + '00'
      digits = chars.bytes.map do |byte|
        case byte
        when 48..57 then byte.chr           # 0..9
        when 65..90 then (byte - 55).to_s   # A..Z
        else
          raise InvalidCharacterError,
                "Unexpected non-alphanumeric character '#{byte.chr}'"
        end
      end
      remainder = digits.join.to_i % 97
      format('%02d', 98 - remainder)
    end

    def self.italian(string)
      odd_mapping = {
        'A' => 1,  'B' => 0,  'C' => 5,  'D' => 7,  'E' => 9,  'F' => 13,
        'G' => 15, 'H' => 17, 'I' => 19, 'J' => 21, 'K' => 2,  'L' => 4,
        'M' => 18, 'N' => 20, 'O' => 11, 'P' => 3,  'Q' => 6,  'R' => 8,
        'S' => 12, 'T' => 14, 'U' => 16, 'V' => 10, 'W' => 22, 'X' => 25,
        'Y' => 24, 'Z' => 23, '0' => 1,  '1' => 0,  '2' => 5,  '3' => 7,
        '4' => 9,  '5' => 13, '6' => 15, '7' => 17, '8' => 19, '9' => 21
      }

      scaled_values = string.chars.map.with_index do |char, index|
        if index.even?
          odd_mapping[char]
        else
          case char.ord
          when 48..57 then char.to_i         # 0..9
          when 65..90 then char.ord - 65     # A..Z
          else
            raise InvalidCharacterError,
                  "Unexpected non-alphanumeric character '#{char}'"
          end
        end
      end

      (scaled_values.inject(:+) % 26 + 65).chr
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
ibandit-0.8.6 lib/ibandit/check_digit.rb
ibandit-0.8.5 lib/ibandit/check_digit.rb
ibandit-0.8.4 lib/ibandit/check_digit.rb
ibandit-0.8.3 lib/ibandit/check_digit.rb
ibandit-0.8.2 lib/ibandit/check_digit.rb
ibandit-0.8.1 lib/ibandit/check_digit.rb
ibandit-0.8.0 lib/ibandit/check_digit.rb
ibandit-0.7.0 lib/ibandit/check_digit.rb