57 lines
1.4 KiB
Python
Executable File
57 lines
1.4 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import sys
|
|
import re
|
|
import math
|
|
|
|
def ean_checksum(eancode):
|
|
"""returns the checksum of an ean string of length 13, returns -1 if the string has the wrong length"""
|
|
if len(eancode) <> 13:
|
|
return -1
|
|
oddsum=0
|
|
evensum=0
|
|
total=0
|
|
eanvalue=eancode
|
|
reversevalue = eanvalue[::-1]
|
|
finalean=reversevalue[1:]
|
|
|
|
for i in range(len(finalean)):
|
|
if i % 2 == 0:
|
|
oddsum += int(finalean[i])
|
|
else:
|
|
evensum += int(finalean[i])
|
|
total=(oddsum * 3) + evensum
|
|
|
|
check = int(10 - math.ceil(total % 10.0)) %10
|
|
return check
|
|
|
|
def check_ean(eancode):
|
|
"""returns True if eancode is a valid ean13 string, or null"""
|
|
if not eancode:
|
|
return True
|
|
if len(eancode) <> 13:
|
|
return False
|
|
try:
|
|
int(eancode)
|
|
except:
|
|
return False
|
|
return ean_checksum(eancode) == int(eancode[-1])
|
|
|
|
def sanitize_ean13(ean13):
|
|
"""Creates and returns a valid ean13 from an invalid one"""
|
|
if not ean13:
|
|
return "0000000000000"
|
|
ean13 = re.sub("[A-Za-z]","0",ean13);
|
|
ean13 = re.sub("[^0-9]","",ean13);
|
|
ean13 = ean13[:13]
|
|
if len(ean13) < 13:
|
|
ean13 = ean13 + '0' * (13-len(ean13))
|
|
return ean13[:-1] + str(ean_checksum(ean13))
|
|
|
|
def main():
|
|
for arg in sys.argv[1:]:
|
|
print sanitize_ean13(arg)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|