mirror of
https://github.com/elder-plinius/P4RS3LT0NGV3.git
synced 2026-07-23 04:20:50 +02:00
73 lines
2.0 KiB
JavaScript
73 lines
2.0 KiB
JavaScript
/**
|
|
* EAN-13 normalization helpers for the Codes tool.
|
|
*/
|
|
(function(global) {
|
|
'use strict';
|
|
|
|
function checksum(base12) {
|
|
var sum = 0;
|
|
for (var i = 0; i < 12; i++) {
|
|
var digit = parseInt(base12.charAt(i), 10);
|
|
sum += (i % 2 === 0) ? digit : digit * 3;
|
|
}
|
|
return String((10 - (sum % 10)) % 10);
|
|
}
|
|
|
|
function upcChecksum(upc12) {
|
|
var sum = 0;
|
|
for (var i = 0; i < 11; i++) {
|
|
var digit = parseInt(upc12.charAt(i), 10);
|
|
sum += (i % 2 === 0) ? digit * 3 : digit;
|
|
}
|
|
return String((10 - (sum % 10)) % 10);
|
|
}
|
|
|
|
function isValidUpcA(digits) {
|
|
return digits.length === 12
|
|
&& digits.charAt(0) === '0'
|
|
&& upcChecksum(digits) === digits.charAt(11);
|
|
}
|
|
|
|
function fromUpcA(upc12) {
|
|
var ean12 = '0' + upc12.slice(0, 11);
|
|
return ean12 + checksum(ean12);
|
|
}
|
|
|
|
function normalize(input) {
|
|
var digits = String(input || '').replace(/\D/g, '');
|
|
if (digits.length < 12) {
|
|
return {
|
|
ok: false,
|
|
error: 'EAN-13 requires 12 or 13 digits.'
|
|
};
|
|
}
|
|
if (digits.length > 13) {
|
|
return {
|
|
ok: false,
|
|
error: 'EAN-13 accepts at most 13 digits.'
|
|
};
|
|
}
|
|
|
|
if (digits.length === 12 && isValidUpcA(digits)) {
|
|
return { ok: true, value: fromUpcA(digits) };
|
|
}
|
|
|
|
var base12 = digits.length === 12 ? digits : digits.slice(0, 12);
|
|
return { ok: true, value: base12 + checksum(base12) };
|
|
}
|
|
|
|
var api = {
|
|
checksum: checksum,
|
|
upcChecksum: upcChecksum,
|
|
isValidUpcA: isValidUpcA,
|
|
fromUpcA: fromUpcA,
|
|
normalize: normalize
|
|
};
|
|
|
|
if (typeof module !== 'undefined' && module.exports) {
|
|
module.exports = api;
|
|
} else {
|
|
global.Ean13Utils = api;
|
|
}
|
|
})(typeof window !== 'undefined' ? window : globalThis);
|