Modest Programmer logo
29 września 2018
Tagi: JavaScript
W poprzednim artykule udało nam się z powodzeniem napisać funkcję walidującą pesel, a dziś dla pogłębienia wiedzy z podstaw w JavaScripcie napiszemy kolejną równie prostą funkcję tym razem walidującą numer nip. W związku z tym, że mamy już doświadczenie w pisaniu funkcji walidacyjnych, napisanie odpowiedniej do nip'u nie powinno być dla nas problemem :)

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));
    for (let i = 0; i < weight.length; i++) {
        sum += (parseInt(nip.substring(i, 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.
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
Programista. Specjalizuje się w C#, głównie WPF, Windows Forms oraz ASP.NET MVC.
Autor bloga ModestProgrammer.pl
Dodaj komentarz
© Copyright 2018 modestprogrammer.pl. Wszelkie prawa zastrzeżone Design by Kazimierz Szpin