Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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 != 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);
// true if they are equal
return checkSum == lastDigit;
}
@cebence
Copy link

cebence commented Dec 26, 2014

It fails when the check digit equals 10.
Line #24 should say:

checkSum = (10 - ((evenTotal + oddTotal) % 10)) % 10;

@tompazourek
Copy link

tompazourek commented Aug 7, 2015

The JS version does not have barcode.length != 12 at the beginning.

@spig
Copy link
Author

spig commented May 14, 2016

@cebence @tompazourek - thank you for your fixes.

@alphanull
Copy link

alphanull commented Sep 23, 2016

Assuming I want to use this code (seems to work fine for me): What is the license type then? Would be nice if you could clarify this.

@fromdev
Copy link

fromdev commented Jul 10, 2021

Just used this gist code in my opensource project that allows you to create & download barcode images for absolutely free. this tool will always be free. Thanks for your contribution making it possible in small time.

https://tools.fromdev.com/bar-code-generator.html

@francipvb
Copy link

francipvb commented Oct 29, 2021

Hello,

What about UPC-E barcodes?

@francipvb
Copy link

francipvb commented Oct 29, 2021

Also I contribute a (very) condensed python chunk to add to your gist:

def validate_length(barcode: str) -> bool:
    return len(barcode) in (8, 12, 13, 14, 18)


def validate_check_digit(barcode: str) -> bool:
    result = sum(
        i * 3 if idx % 2 == 0 else i
        for idx, i in enumerate(
            (int(i) for i in barcode),
        )
    )

    return result % 10 == 0


def validate_barcode(barcode: str) -> bool:
    return validate_length(barcode) and validate_check_digit(barcode)

Bye.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment