Class: HkidValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/hkid_validator.rb

Class Method Summary collapse

Class Method Details

.valid?(number) ⇒ Boolean

Returns:

  • (Boolean)


3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/hkid_validator.rb', line 3

def valid?(number)
  sanitized = number.scan(/\p{Alnum}+/).join.upcase

  return false unless sanitized[-1] =~ /(\d+|A)/

  unless (sanitized.length == 8 &&
          sanitized[0] =~ /[A-Z]/ &&
          sanitized[1...-1] =~ /\d+/) ||
         (sanitized.length == 9 &&
          sanitized[0] =~ /[A-Z]/ &&
          sanitized[1] =~ /[A-Z]/ &&
          sanitized[2...-1] =~ /\d+/)

    return false
  end

  weighted_sum = 324
  queue = sanitized.split('')[0...-1]

  queue[0] = value_at_char(queue[0])
  if sanitized.length == 9
    queue[1] = value_at_char(queue[1])
  end

  while queue.length > 0
    weighted_sum += queue.shift.to_i * (queue.length + 2)
  end

  remainder = weighted_sum % 11

  if remainder == 0
    return sanitized[-1].to_i == 0
  elsif remainder == 1
    return sanitized[-1] == 'A'
  elsif remainder >= 2 && remainder <= 10
    return sanitized[-1].to_i == (11 - remainder)
  end
end