70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
|  * 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 Lengths; 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 numeric 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);
 | |
| } |