Blog Dla Programistów C#/.NET

sobota, 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));
    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.
Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Komentarze (5)
romek-z
ROMEK-Z, sobota, 28 grudnia 2019 21:04
Czy zamierzasz cos pisac o optymalizacji kodu? Pisane w pętli weight.length jest zbędne bo: 1) zamiast jednej zmiennej pobierany jest bardziej skomplikowane wyrażenie bo jest to rozmiar tablicy, prościej jest raz pobrac ten rozmiar i przechowac w zmiennej szczególnie że ta tablica nie zmienia rozmiaru. 2) rozmiar tablicy dla numeru NIP jest stały Dodatkowo używanie nip.substring(i, i + 1) jest dość 'niezwykłe' gdyz 2 razy wołamy wartość zmiennej i, a chodzi nam o pobranie jednego znaku; prościej jest użyć nip.substr(i, 1), a jest jeszcze prostszy (w sensie długości kodu) sposób. Dodatkowo kod nie sprawdza czy liczba cyfr w numerze NIP jest prawidłowa. Łatwo się może zdarzyć, że ktoś wpisze literę O zamiast cyfry 0 i program pokaże, że jest błąd ale nie pokaże gdzie i na czym polega. pozdrawiam Romek
Kazimierz Szpin
KAZIMIERZ SZPIN, poniedziałek, 6 stycznia 2020 11:53
@ROMEK-Z, masz rację. Zoptymalizowałem kod o Twoje wskazówki :)
Maxie
MAXIE, wtorek, 14 lipca 2020 19:21
Trochu się nie zgadzam nadal z komentarzem powyżej ^^" pracuję jako frontendowiec i widzę o wiele wiele więcej błędów optymalizacyjnych. Tak to powinno wyglądać mniej więcej: const weight = [6, 5, 7, 2, 3, 4, 5, 6, 7]; const isNipValid = x => { const y = String(x); if (y.length !== 10) { return false; } const sum = y.split('').map((z, i) => parseInt(z) * weight[i]).reduce((a, b) => a + b, 0); return String(sum % 11) === y.slice(-2); };
Robert
ROBERT, wtorek, 13 grudnia 2022 00:25
Dzięki za artykuł. Cień sytuacji gdy ktoś poda właściwy NIP i zakończy go dodatkowa cyfra? :)
Kazimierz Szpin
KAZIMIERZ SZPIN, czwartek, 15 grudnia 2022 09:00
@ROBERT, czyli jest to sytuacja, gdy będzie za dużo cyfr. Wystarczy najpierw sprawdzić ilość cyfr i jeżeli będzie za dużo to nie sprawdzać już nawet dalszych warunków i zwrócić false. Musisz to zrobić po replace, jak już ewentualne spacje i myślniki zostaną usunięte.
Dodaj komentarz

Wyszukiwarka

© Copyright 2025 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin