Я пишу гем для определения номеров отслеживания (называемый tracking_number, естественно). Он ищет в тексте допустимые форматы номеров отслеживания, а затем запускает эти форматы через вычисление контрольной суммы, как указано в спецификации каждой соответствующей службы, для определения допустимых номеров.
На днях я отправил письмо с помощью USPS Certified Mail, получил от USPS сопроводительный номер для отслеживания и загрузил его в свой драгоценный камень, но он не прошел проверку. Я вполне уверен, что выполняю вычисления правильно, но у меня закончились идеи.
Номер проверяется с использованием кода USS 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
Согласно моим расчетам, основанным на предоставленной спецификации, последняя цифра должна быть 3, чтобы быть действительной. Тем не менее, автоматическое определение номера отслеживания Google правильно определяет номер как есть, поэтому я могу только предположить, что делаю что-то не так.