追跡番号( tracking_number、natchと呼ばれる)を検出するためのgemを書いています。テキストで有効な追跡番号の形式を検索し、それぞれのサービスの仕様で指定されているチェックサム計算を通じてそれらの形式を実行して、有効な番号を決定します。
先日、USPS Certified Mailを使用して手紙を郵送し、USPSから付随する追跡番号を取得し、それを私の宝石に送りましたが、検証に失敗しました。私は計算を正しく実行しているとかなり確信していますが、アイデアが不足しています。
この番号は、次のドキュメントのセクション2.8(15ページ)で説明されているように、USSコード128を使用して検証されます。http ://www.usps.com/cpim/ftp/pubs/pub109.pdf
郵便局から受け取った追跡番号は「7196901075600307 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の追跡番号の自動検出では、番号がそのまま検出されるため、何か間違ったことをしているとしか思えません。