Przejdź do głównej zawartości

Dowód osobisty

Numer polskiego dowodu osobistego (dowód osobisty) to 9-znakowy alfanumeryczny identyfikator składający się z 3-literowej serii, 5-cyfrowego numeru sekwencyjnego i cyfry kontrolnej weryfikowanej przy użyciu ważonej sumy kontrolnej ICAO 9303.

import { Numerik } from '@slashlab/numerik-js'
// Szybkie sprawdzenie
Numerik.idCard().isValid('ABC123454') // true
// Pełny obiekt z danymi
const result = Numerik.idCard().validate('ABC123454')
result.isValid // true
// Parsowanie do obiektu z danymi
const idCard = Numerik.idCard().parse('ABC123454')
// Null zamiast wyjątku w przypadku błędu
const maybe = Numerik.idCard().tryParse('bad-input') // null

Dane wejściowe są normalizowane do wielkich liter; spacje i myślniki są usuwane:

Numerik.idCard().isValid('abc 123 454') // true
Numerik.idCard().isValid('abc-123-454') // true

parse() i tryParse() zwracają instancję IdCard.

MetodaTyp zwracanyOpis
getRaw()stringOryginalne dane wejściowe, bez zmian.
getNormalized()stringWielkie litery, spacje i myślniki usunięte.
toString()stringAlias dla getNormalized().
MetodaTyp zwracanyOpis
getSeries()stringPierwsze 3 znaki (seria literowa), np. ABC.
getSequentialNumber()stringZnaki 3–7 (5 cyfr), np. 12345.
getCheckDigit()stringZnak 8 (cyfra kontrolna), np. 4.
const idCard = Numerik.idCard().parse('ABC123454')
idCard.getRaw() // 'ABC123454'
idCard.getNormalized() // 'ABC123454'
idCard.getSeries() // 'ABC'
idCard.getSequentialNumber() // '12345'
idCard.getCheckDigit() // '4'
// Małe litery + myślniki w danych wejściowych
const idCard2 = Numerik.idCard().parse('abc-123-454')
idCard2.getRaw() // 'abc-123-454'
idCard2.getNormalized() // 'ABC123454'
PowódWartośćWarunek
InvalidLengthinvalid_lengthDane wejściowe nie mają dokładnie 9 znaków po normalizacji.
InvalidCharactersinvalid_charactersPozycje 0–2 zawierają znaki inne niż litery, lub pozycje 3–8 zawierają znaki inne niż cyfry.
InvalidFormatinvalid_formatLitery serii zawierają O lub Q (wykluczone z alfabetu serii dowodów osobistych).
InvalidChecksuminvalid_checksumCyfra kontrolna ICAO 9303 nie zgadza się.

Używa ważonej sumy kontrolnej ICAO 9303. Wagi [7, 3, 1] powtarzają się cyklicznie dla pierwszych 8 znaków. Cyfry odwzorowują swoją wartość nominalną (0–9); litery odwzorowują A=10 do Z=35. Cyfra kontrolna równa się ważonej sumie modulo 10.

  1. Odrzuć dane wejściowe dłuższe niż 32 znaki. Usuń spacje i myślniki, zamień na wielkie litery.
  2. Sprawdź, czy pozostało dokładnie 9 znaków.
  3. Sprawdź, czy pozycje 0–2 to litery alfabetu.
  4. Sprawdź, czy pozycje 0–2 nie zawierają O ani Q.
  5. Sprawdź, czy pozycje 3–8 to cyfry.
  6. Oblicz sumę kontrolną ICAO 9303 dla pozycji 0–7. Wynik musi być równy cyfrze na pozycji 8.

Pełna dokumentacja algorytmu ICAO 9303 w sekcji Algorytmy.