Skip to content

Instantly share code, notes, and snippets.

@rustamojukas
Forked from spig/validate_barcode.js
Created June 14, 2018 08:28
Show Gist options
  • Save rustamojukas/2850bfe15d745aab3991017cd4c57fb1 to your computer and use it in GitHub Desktop.
Save rustamojukas/2850bfe15d745aab3991017cd4c57fb1 to your computer and use it in GitHub Desktop.
Validate a barcode UPC-E, UPC-A, EAN, EAN-14, SSCC
// checksum calculation for GTIN-8, GTIN-12, GTIN-13, GTIN-14, and SSCC
// based on http://www.gs1.org/barcodes/support/check_digit_calculator
function isValidBarcode(barcode) {
// check length
if (barcode.length < 8 || barcode.length > 18 ||
(barcode.length != 8 && barcode.length != 12 &&
barcode.length != 13 && barcode.length != 14 &&
barcode.length != 18)) {
return false;
}
var lastDigit = Number(barcode.substring(barcode.length - 1));
var checkSum = 0;
if (isNaN(lastDigit)) { return false; } // not a valid upc/ean
var arr = barcode.substring(0,barcode.length - 1).split("").reverse();
var oddTotal = 0, evenTotal = 0;
for (var i=0; i<arr.length; i++) {
if (isNaN(arr[i])) { return false; } // can't be a valid upc/ean we're checking for
if (i % 2 == 0) { oddTotal += Number(arr[i]) * 3; }
else { evenTotal += Number(arr[i]); }
}
checkSum = (10 - ((evenTotal + oddTotal) % 10)) % 10;
// true if they are equal
return checkSum == lastDigit;
}
def valid_upc(upc)
# check length
if (upc.length < 8 or upc.length > 18 or
(upc.length != 8 && upc.length != 12 &&
upc.length != 13 && upc.length != 14 &&
upc.length != 18)
)
return false
end
last_digit = upc.slice!(-1).to_i
check_sum = 0
arr = upc.split(//).reverse
odd_total = even_total = 0
arr.each_index do |i|
if (i % 2 == 0)
odd_total = odd_total + (arr[i].to_i * 3)
else
even_total = even_total + arr[i].to_i
end
end
check_sum = (10 - ((even_total + odd_total) % 10)) % 10
# true if they are equal
return check_sum == last_digit
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment