You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
72 lines
2.1 KiB
/** |
|
* The most commonly used EAN standard is |
|
* the thirteen-digit EAN-13, while the |
|
* less commonly used 8-digit EAN-8 barcode was |
|
* introduced for use on small packages. |
|
* Also EAN/UCC-14 is used for Grouping of individual |
|
* trade items above unit level(Intermediate, Carton or Pallet). |
|
* For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/ |
|
* EAN consists of: |
|
* GS1 prefix, manufacturer code, product code and check digit |
|
* Reference: https://en.wikipedia.org/wiki/International_Article_Number |
|
* Reference: https://www.gtin.info/ |
|
*/ |
|
import assertString from './util/assertString'; |
|
/** |
|
* Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14 |
|
* and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14), |
|
* with exact numberic matching of 8 or 13 or 14 digits [0-9] |
|
*/ |
|
|
|
var LENGTH_EAN_8 = 8; |
|
var LENGTH_EAN_14 = 14; |
|
var validEanRegex = /^(\d{8}|\d{13}|\d{14})$/; |
|
/** |
|
* Get position weight given: |
|
* EAN length and digit index/position |
|
* |
|
* @param {number} length |
|
* @param {number} index |
|
* @return {number} |
|
*/ |
|
|
|
function getPositionWeightThroughLengthAndIndex(length, index) { |
|
if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) { |
|
return index % 2 === 0 ? 3 : 1; |
|
} |
|
|
|
return index % 2 === 0 ? 1 : 3; |
|
} |
|
/** |
|
* Calculate EAN Check Digit |
|
* Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit |
|
* |
|
* @param {string} ean |
|
* @return {number} |
|
*/ |
|
|
|
|
|
function calculateCheckDigit(ean) { |
|
var checksum = ean.slice(0, -1).split('').map(function (_char, index) { |
|
return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index); |
|
}).reduce(function (acc, partialSum) { |
|
return acc + partialSum; |
|
}, 0); |
|
var remainder = 10 - checksum % 10; |
|
return remainder < 10 ? remainder : 0; |
|
} |
|
/** |
|
* Check if string is valid EAN: |
|
* Matches EAN-8/EAN-13/EAN-14 regex |
|
* Has valid check digit. |
|
* |
|
* @param {string} str |
|
* @return {boolean} |
|
*/ |
|
|
|
|
|
export default function isEAN(str) { |
|
assertString(str); |
|
var actualCheckDigit = Number(str.slice(-1)); |
|
return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str); |
|
} |