Przejdź do głównej zawartości

Paszport

Numer polskiego paszportu to 9-znakowy alfanumeryczny identyfikator składający się z 2-literowej serii, 6-cyfrowego numeru sekwencyjnego i cyfry kontrolnej weryfikowanej przy użyciu ważonej sumy kontrolnej ICAO 9303 — tego samego algorytmu używanego w dokumentach podróży na całym świecie.

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

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

Numerik.passport().isValid('ab 123456 4') // true
Numerik.passport().isValid('ab-123456-4') // true

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

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 2 znaki (seria literowa), np. AB.
getSequentialNumber()stringZnaki 2–7 (6 cyfr), np. 123456.
getCheckDigit()stringZnak 8 (cyfra kontrolna), np. 4.
const passport = Numerik.passport().parse('AB1234564')
passport.getRaw() // 'AB1234564'
passport.getNormalized() // 'AB1234564'
passport.getSeries() // 'AB'
passport.getSequentialNumber() // '123456'
passport.getCheckDigit() // '4'
// Dane wejściowe małymi literami
const passport2 = Numerik.passport().parse('ab1234564')
passport2.getRaw() // 'ab1234564'
passport2.getNormalized() // 'AB1234564'
PowódWartośćWarunek
InvalidLengthinvalid_lengthDane wejściowe nie mają dokładnie 9 znaków po normalizacji.
InvalidCharactersinvalid_charactersPozycje 0–1 zawierają znaki inne niż litery, lub pozycje 2–8 zawierają znaki inne niż cyfry.
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–1 to litery alfabetu.
  4. Sprawdź, czy pozycje 2–8 to cyfry.
  5. 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.