我正在写一个宝石来检测跟踪号码(称为tracking_number,natch).它在文本中搜索有效的跟踪号格式,然后通过每个相应服务规范中指定的校验和计算来运行这些格式,以确定有效数字.
有一天,我使用USPS认证邮件邮寄了一封信,从USPS获得了随附的跟踪号码,并将其输入我的宝石,但未通过验证.我相当肯定我正在正确地执行计算,但是已经没有想法了.
使用USS Code 128验证该号码,如以下文档的第2.8节(第15页)中所述:http://www.usps.com/cpim/ftp/pubs/pub109.pdf
我从邮局得到的跟踪号是"7196 9010 7560 0307 7385",我用来计算校验位的代码是:
def valid_checksum?
# tracking number doesn't have spaces at this point
chars = self.tracking_number.chars.to_a
check_digit = chars.pop
total = 0
chars.reverse.each_with_index do |c, i|
x = c.to_i
x *= 3 if i.even?
total += x
end
check = total % 10
check = 10 - check unless (check.zero?)
return true if check == check_digit.to_i
end
Run Code Online (Sandbox Code Playgroud)
根据我提供的规格计算,最后一位数应为3才能生效.但是,Google的跟踪号码自动检测功能可以很好地提取数字,所以我只能假设我做错了什么.