class ChinesePid

Constants

CITY_CODES

Public Class Methods

new(pid) click to toggle source
# File lib/chinese_pid.rb, line 14
def initialize(pid)
  @pid = pid
end

Public Instance Methods

birthday() click to toggle source
# File lib/chinese_pid.rb, line 43
def birthday
  return nil unless valid?
  if old_standard?
    return Date.parse("19#{@pid[6, 6]}")
  else
    return Date.parse(@pid[6, 8])
  end
end
gender() click to toggle source
# File lib/chinese_pid.rb, line 18
def gender
  return nil unless valid?
  if old_standard?
    return @pid[14].to_i % 2
  else
    return @pid[16].to_i % 2
  end
end
old_standard?() click to toggle source
# File lib/chinese_pid.rb, line 57
def old_standard?
  return true if @pid.size == 15
  return false
end
province() click to toggle source
# File lib/chinese_pid.rb, line 52
def province
  return nil unless valid?
  return CITY_CODES[@pid[0, 2]]
end
valid?() click to toggle source
# File lib/chinese_pid.rb, line 27
def valid?
  return false if @pid.size != 15 && @pid.size != 18
  return false unless /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|x|X)?$/.match(@pid)
  return false if CITY_CODES[@pid[0, 2]].nil?
  unless old_standard?
    factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
    sum = 0
    for index in 0..16
      sum += @pid[index].to_i * factor[index]
    end
    return false if parity[sum % 11].to_s.upcase != @pid[17].to_s.upcase
  end
  return true
end