物流情報を扱ってる弊社ですが、JANコードを扱うことが非常に多いです
しかし、JANコードっぽい情報なのにJANコードで探しても見つからない商品があります
これはなぜ・・・
原因
JANコードっぽいものはITF物流商品情報でした
参考:集合包装用商品コードとITFシンボル
ITFってなんぞ?
JANコードが商品単品での商品識別コードで、
ITFコードは物流商品識別コードです
つまり、
低糖質カルボナーラ CarbOFF(はごろもフーズ)
にかかれているのがJANコードで、
低糖質カルボナーラ CarbOFF(はごろもフーズ)×5個
にかかれているのがITFコードです
商品は単品で流通するものと、ある程度セットになって流通するものがあります
ITFコードは一つのJANコードに対して複数紐づくことになりますね
問題
さて、ここはQiitaなので、エンジニアっぽい事をこれから書きます
ユーザーが入力するのがJANコードなのかITFコードなのか正直分かりません
今までは、JANコードのチェックデジットだけみて、JANコードの妥当性を見てましたが、
顧客は本当はITFコードを入力していたかもしれない
つまり、JANコードが駄目だったらITFコードのチェックデジットもチェックすればいいんじゃないか
そんな事を考えました
成果物
入力した値がJANコードもしくはITFコードであったらtrueを返します
class AucfanJancode:
total_even = 0
total_odd = 0
def setEvenOdd(self, jancode):
self.total_even = self.total_odd = 0
for index, item in enumerate(list(jancode)):
if (index % 2) == 0:
self.total_even += int(item)
else:
self.total_odd += int(item)
def isJancode(self, jancode):
self.setEvenOdd(jancode[:12])
return int(jancode[12:]) == (10 - (self.total_even + (self.total_odd * 3)) % 10)
def isItfcode(self, jancode):
if len(jancode) <= 13:
jancode = '1' + jancode
self.setEvenOdd(jancode[:13])
return int(jancode[13:]) == (10 - (self.total_odd + (self.total_even * 3)) % 10)
return 10 - (self.total_odd + (self.total_even * 3)) % 10
def isCode(self, jancode):
return self.isJancode(jancode) or self.isItfcode(jancode)
8桁のものもあるぞー!
とか、
UPC対応は?
みたいな話もあるので、もうちょい桁数チェックとか厳密にやっても良かったかもしれませんが、今回はこれで勘弁してください