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