Zacznijmy ponownie od teorii. Numer nip składa się z 10 cyfr, z czego podobnie jak przy numerze pesel ostatnia jest cyfrą kontrolną. Każda cyfra również ma swoją wagę, odpowiednio są to wagi: 6, 5, 7, 2, 3, 4, 5, 6, 7. Należy zsumować wynik mnożenia każdej cyfry przez wagę. W ostatnim kroku następuje sprawdzanie czy modulo 11 (całkowita reszta z dzielenia przez 11) z tej sumy jest równa wartości cyfry kontrolnej.
Najpierw przeanalizujmy powyższe kroki dla nip'u: 7622654927, który powinien być prawidłowym nip'em.
7*6 + 6*5 + 2*7 + 2*2 + 6*3 + 5*4 + 4*5 + 9*6 + 2*7 = 216
216 % 11 = 7 (modulo 216)
7 = 7 (cyfra kontrola)
Wszystko się zgadza, nip jest prawidłowy.
Nauczeni doświadczeniem z poprzedniego artykułu dodamy również sprawdzanie czy nasz parametr jest odpowiedniego typu. Czasem nip podawany jest z myślnikami, a czasem bez, także będziemy również musieli uwzględnić to w naszej funkcji. Nasza funkcja może wyglądać mniej więcej tak:
function isValidNip(nip) {
if(typeof nip !== 'string')
return false;
nip = nip.replace(/[\ \-]/gi, '');
let weight = [6, 5, 7, 2, 3, 4, 5, 6, 7];
let sum = 0;
let controlNumber = parseInt(nip.substring(9, 10));
let weightCount = weight.length;
for (let i = 0; i < weightCount; i++) {
sum += (parseInt(nip.substr(i, 1)) * weight[i]);
}
return sum % 11 === controlNumber;
}
Najpierw sprawdzamy czy parametr nip jest odpowiedniego typu. Następnie usuwamy wszystkie myślniki i spacje, tak aby nasz nip składał się z samych cyfr. W kolejnej linii podobnie jak robiliśmy to w przypadku walidacji numeru pesel deklarujemy odpowiednie wagi, zmienną sumującą i przypisujemy do zmiennej controlNumber ostatnią cyfrę, która jest cyfrą kontrolną. W kolejnych krokach przy pomocy pętli sumujemy mnożenie każdej cyfry przez odpowiednią wagę i zwracamy true jeśli modulo 11 (czyli całkowita reszta z dzielenia przez 11) jest równe cyfrze kontrolnej. Przeprowadźmy jeszcze na koniec kilka testów, myślę że wszystko powinno być ok.console.log('Prawidłowy nip', isValidNip('7622654927')); //Prawidłowy nip true
console.log('Prawidłowy nip', isValidNip('762 265 4927')); //Prawidłowy nip true
console.log('Prawidłowy nip', isValidNip('762-265-4927')); //Prawidłowy nip true
console.log('Prawidłowy nip', isValidNip('3892726480')); //Prawidłowy nip true
console.log('Prawidłowy nip', isValidNip('5249366383')); //Prawidłowy nip true
console.log('Nieprawidłowy nip', isValidNip('5249116383')); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip('11493116383')); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip('52412116383')); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip('')); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip(1)); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip(true)); //Nieprawidłowy nip false
console.log('Nieprawidłowy nip', isValidNip(null)); //Nieprawidłowy nip false
Rzeczywiście tym razem wszystkie wyniki są prawidłowo, zauważ że sprawdziliśmy różne przypadki tj. wprowadzenie null'a, wartości true, oraz string'ów zarówno z myślnikami jak i spacjami. Nasza kolejna funkcja walidacyjna działa zgodnie z założeniami.To wszystko co chciałem Ci przekazać w tym artykule. Zapraszam Cię do kolejnych artykułów z serii podstaw programowania w języku JavaScript.
Poprzedni artykuł - Walidacja pesel w JavaScript.
Następny artykuł - Symbole w JavaScript.