Euromind
  • Javascript
    • Javascript

      Dansk evighedskalender

      7. december, 2020

      Javascript

      API til Statistikbanken

      21. september, 2019

      Javascript

      IntersectionObserver

      9. august, 2019

      Javascript

      Navngivne RegEx-grupper i ECMAScript 2018

      29. juli, 2019

      Javascript

      RegEx: Unicode og Look Backward i ECMAScript 2018

      24. juli, 2019

  • CSS/SCSS
    • CSS/SCSS

      Dansk evighedskalender

      7. december, 2020

      CSS/SCSS

      Variable fonte med dansk tegnsæt i open source

      11. august, 2019

      CSS/SCSS

      Progressbar for dokumentposition

      31. juli, 2019

      CSS/SCSS

      Media Query i 2019

      18. juli, 2019

      CSS/SCSS

      Danske Adressers Web API

      17. juli, 2019

  • C#
    • C#

      Authentication for IOS og Android med Firebase i…

      4. oktober, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 3

      5. september, 2019

      C#

      Hurtig eksport til Excel

      4. september, 2019

      C#

      Andersen, Grundtvig, Kierkegaard og ML.NET – del 2

      2. september, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 1

      11. august, 2019

  • Javascript
    • Javascript

      Dansk evighedskalender

      7. december, 2020

      Javascript

      API til Statistikbanken

      21. september, 2019

      Javascript

      IntersectionObserver

      9. august, 2019

      Javascript

      Navngivne RegEx-grupper i ECMAScript 2018

      29. juli, 2019

      Javascript

      RegEx: Unicode og Look Backward i ECMAScript 2018

      24. juli, 2019

  • CSS/SCSS
    • CSS/SCSS

      Dansk evighedskalender

      7. december, 2020

      CSS/SCSS

      Variable fonte med dansk tegnsæt i open source

      11. august, 2019

      CSS/SCSS

      Progressbar for dokumentposition

      31. juli, 2019

      CSS/SCSS

      Media Query i 2019

      18. juli, 2019

      CSS/SCSS

      Danske Adressers Web API

      17. juli, 2019

  • C#
    • C#

      Authentication for IOS og Android med Firebase i…

      4. oktober, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 3

      5. september, 2019

      C#

      Hurtig eksport til Excel

      4. september, 2019

      C#

      Andersen, Grundtvig, Kierkegaard og ML.NET – del 2

      2. september, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 1

      11. august, 2019

Euromind
CSS/SCSSHTMLJavascriptWebdesign

Felt for CPR-nummer

af Per Lindsø Larsen 19. april, 2019
skrevet af Per Lindsø Larsen 19. april, 2019
Felt for CPR-nummer

Ved folkeregisterloven i 1968 blev personnummeret – CPR-nummeret – indført og hver borger i landet tildelt en 10-cifret unik identifikation. Så unik, at borgeren tager det med sig i graven. Modsat f.eks. mobilnumre så genbruges personnumre ikke. CPR-nummeret var en snedig lille konstruktion, der både indeholdt oplysning om borgerens fødselsdata og køn. Hertil skruet samme på en sådan måde, at sidste ciffer ikke blot rummer oplysning om borgerens køn, men også tjener som kontrolciffer, så en modulus-11 kontrol kunne afgøre om CPR-nummeret var gyldigt og dermed sandsynligvis angivet korrekt. En ganske nyttig valideringsmulighed i de følgende årtiers computerprogrammer, der skulle styre borgerne via bl.a. personnummer.

Desværre havde de fremsynede kræfter overset den ikke helt uvæsentlige detalje, at befolkningstallet stiger og personnummeret i den oprindelige konstruktion kun gav plads til 270 mænd og 270 kvinder per fødselsdato. Det var ikke længere tilstrækkeligt, og derfor meddelte CPR-registret, at fra oktober 2007 kunne modulus-11 ikke længere anvendes ved validering af CPR-numre. Man begyndte fra samme dato af udstede CPR-numre med ”ugyldige” kontrolcifre og et stigende antal borgere må således livet igennem leve med et CPR-nummer, der ikke er Modulus-11 kompatibelt. De første år voldte det en del administrative problemer, da disse personer ikke kunne logges på systemer, der allerede havde implementeret Modulus-11 som validering. Det er den slags ting der sker, når virkeligheden ikke længere har den fornødne fleksibilitet til at tilpasse sig IT-systemer. Det sker med jævne mellemrum. Virkeligheden er ikke perfekt!  

Menneskers forhold til deres CPR-nummer er meget forskelligt. Nogle anser det som en hemmelighed, ikke flere end nødvendigt skal have kendskab til, mens andre har et mere afslappet forhold til det. I 1979 udgav Kim Larsen således et album, hvis titel slet og ret var hans personnummer: ”231045-0637”.
Det er under visse omstændigheder muligt at få skiftet sit personnummer. Det gælder f.eks. ofre for ID-tyveri og ved lov af 25. juni 2014 er det også blevet muligt at få nyt CPR-nummer, hvis man oplever at tilhøre – eller identificerer sig med – et andet køn, end det man er født som.

Udviklingen har således sat sit præg på det 50-årige nummersystem, men det ændrer jo ikke ved, at det skal fortsat skal indtastet i utallige sammenhænge og også valideres på bedst mulig måde.

Det er tilsyneladende ikke helt uproblematisk. F.eks. vil nogle gerne udfylde et CPR-felt med bindestreg, mens andre undlader det, og i mange tilfælde er man som bruger ikke helt sikker på, om systemet, man indtaster til, forventer det ene eller det andet – eller kan tage højde for begge dele.

Følgende fra en læge-booking portal er et typisk eksempel. Man indtaster de ønskede oplysninger og tager chancen med en bindestreg i CPR-numret, det går godt, lige indtal der trykkes på ”Send” hvor fejlmeldingen kommer, at CPR sørme skal være på 10 tegn, hvilket så må betyde, at bindestregen alligevel ikke skulle have været der. I mellemtiden er det indtastede nummer i sikkerheden tjeneste blevet forvandlet til ******** der gør det umuligt at fjerne stregen, og det er så bare forfra igen.

Det er mildest talt lidt bøvlet og andre siden forsøger da også på pædagogisk vis at afværge at brugeren kommer derud, med en længere forklaring på, hvorledes CPR-nummeret korrekt skal indtastes.

 Jeg er stødt på online-forms, hvor der ligefrem kan downloades en pdf med instruks i korrekt udfyldning – herunder CPR-feltet

Værst er selvfølgelig de tilfælde, hvor brugeren får en fejlmelding på et korrekt CPR-nummer uden nærmere forklaring. Jeg vil tro kundesupporten har en del ældre medborgere i røret på den konto.

Hvor svært bør det være?

Det burde ikke volde den slags kvaler at formidle et CPR-nummer. I virkeligheden kan en streng med CPR-nummer valideres med et enkelt RegEx-mønster, der både tager inkluderer at brugeren kan have brugt bindestreg, mellemrum eller ingenting, og samtidig validerer dato og tager højde for skudår, 29. februar og andet godt fra havet.

Den anden del handler om at guide brugeren bedst muligt under indtastning, så han eller hun oplever, at der kun er den korrekte måde at gøre det på.

Der er ingen grund til at gå over åen efter vand, hvis man kan få en fadøl – og det er præcis hvad man får med det lille open-source plugin cleave.js. Det fylder ikke mere end  det kan være i en håndtaske (< 20 Kb) og input-felter kan herefter med enkle midler skræddersyes efter behov.

npm install --save cleave.js
CDN: https://cdnjs.cloudflare.com/ajax/libs/cleave.js/1.5.0/cleave.min.js
GITHUB: https://github.com/nosir/cleave.js

I dette tilfælde vil det være optimalt at CPR-input tilrettelægges således, at feltet kun accepterer tal og at der efter 6 cifre automatisk sættes en bindestreg, hvorefter der accepteres fire yderligere tal. Det kan gøres med

var cleave = new Cleave('.cleaveinput', {
   numericOnly: true,
    delimiter: '-',
    blocks: [6, 4]
});

Der er nu sikret en indtastning uden faldgruber, og det er så tid til at validere, hvad valideres kan, og give brugeren en tilbagemelding med det samme.

Hvis man har en af de dage, hvor man synes RegEx-metoden er for langhåret, så kan de første 6 cifre også valideres på en mere ordinær måde. Mærkeligt nok så ligger dato-validering ikke lige til højrebenet i javascript. Metoden er, at sætte dato-oplysningerne ind i et Date-objekt, og så efterfølgende teste, om det var noget den åd. Desværre er det heller ikke nok, da javascript på dato-området opererer med en alternativ begavelse:

Vi risikerer altså, at javascript godkender dato-angivelser, der ikke repræsenterer en gyldig dato. Jeg kan godt lide Eduardo Sganzeria’a enkle løsning. selv om den kræver lidt modifikation. Hvorfor gør tingene mere kompliceret end nødvendigt. Det handler blot om at tjekke, om den dato, der kommer ud er identisk med dén, der puttes ind:

function validDate(str) {
    var day = str.substring(0, 2);
    var month = str.substring(2, 4);
    var year = str.substring(4, 6);
    const date = new Date(`20${year}/${month}/${day}`);
    return (Boolean(+date) && date.getDate() == day)
}

Gensyn med Modulus-11

Selv om Modulus-11 siden 2007 ikke har været en gyldig måde at afgøre på, om et CPR-nummer er korrekt indtastet, så er faktum stadig – og vil være det mange år endnu – at kun et lille mindretal har CPR-numre med ugyldig kontrolciffer.

Er der tale om en opsætning, der f.eks. kun skal bruges internt i en organisation kan det derfor være en nyttig vejledende information for indtasteren at få at vide, de enkelte gange det sker, at Modulus-11 ikke er opfyldt. Det giver muligheden for hurtigt at tjekke en ekstra gang, om der er tale om en indtastningsfejl.

Modulus-11 beregnes ved at multiplicere hver af de første ni cifre men henholdsvis: 4,3,2,7,6,5,4,3 og 2 og finde summen heraf. 11 minus den rest, som bliver tilbage ved at dividere summen med 11 udgør kontrolcifferet. Giver divisionen resten 1, kan det pågældende løbenummer (ciffer 7-9) ikke anvendes, fordi kontrolcifferet derved ville blive tocifret. I Javascript kan testen udføres på denne måde:

function modulus11(cpr) {
    var checksum = 0;
    for (i = 9; i > -1; i--) {
        checksum += (+cpr.charAt(i)) * ((i > 2) ? (10 - i) : (4 - i));
    }
    if (checksum % 11 == 0)
        return true;
}

Nu mangler blot at “hooke” det hele op med onKeyup, så det registreres hver gang et tal indtastes i feltet og evaluering og evt. svar til indtasteren kommer, så snart der er indtastet 10 cifre:

See the Pen CPR by Per Lindsø Larsen (@lindsoe) on CodePen.

CPR
0 Kommentarer
4
FacebookTwitterPinterestEmail
forrige post
Gmail, Yahoo og Outlook som SMTP-server
næste post
Console-vindue i JsFiddle

Relaterede indlæg

Dansk evighedskalender

7. december, 2020

Headless browser på 10 minutter

25. juli, 2020

API til Statistikbanken

21. september, 2019

Variable fonte med dansk tegnsæt i open source

11. august, 2019

IntersectionObserver

9. august, 2019

Progressbar for dokumentposition

31. juli, 2019

Navngivne RegEx-grupper i ECMAScript 2018

29. juli, 2019

RegEx: Unicode og Look Backward i ECMAScript 2018

24. juli, 2019

Media Query i 2019

18. juli, 2019

Danske Adressers Web API

17. juli, 2019

Efterlad en kommentar Afbryd svar

Gem mit navn, email, og website i denne browser til senere kommentarer.

Seneste indlæg

  • Dansk evighedskalender

    7. december, 2020
  • Automatisk køreafstand i Excel

    17. august, 2020
  • Headless browser på 10 minutter

    25. juli, 2020

Kategorier

  • C#
  • CSS/SCSS
  • Excel
  • HTML
  • Javascript
  • Mobile
  • Webdesign
  • Xamarin

Om mig

Om mig

Per Lindsø Larsen

Freelance fullstack developer bo9sat i Aarhus.

Du kan hyre mig til korterevarende projekter eller konkrete opgaveløsninger.

Pæn rabat til non-profit organisationer og foreninger.

Når jeg ikke koder, deltager jeg løbende i diverse spændende forskningsprojekter om alt andet end kodning.

Keep in touch

Facebook Twitter Email Github

Tags

Adresser AMP AMP Story Android API Billedformater Billedoptimering Brand C# Codepen Cordova CPR Crome DevTools CSS Debug Ecmascript Excel Fonte Gmail Gulp HTML Ikoner IOS Javascript JsFiddle Machine Learning Mail Mediaquery ML.NET Mobile RegEx SCSS SMTP Stylometri Visual Studio Webdesign Xamarin

Nyhedsbrev

Timeld nyhedsbrev for info om nye blog-indlæg, tips m.v.

  • Facebook
  • Twitter
  • Email
  • Github

@2019 - Euromind.com - Code-To-Go. All Right Reserved.
lindsoe@gmail.com - mobil: 42797273


Tilbage til top
Euromind
  • Javascript
    • Javascript

      Dansk evighedskalender

      7. december, 2020

      Javascript

      API til Statistikbanken

      21. september, 2019

      Javascript

      IntersectionObserver

      9. august, 2019

      Javascript

      Navngivne RegEx-grupper i ECMAScript 2018

      29. juli, 2019

      Javascript

      RegEx: Unicode og Look Backward i ECMAScript 2018

      24. juli, 2019

  • CSS/SCSS
    • CSS/SCSS

      Dansk evighedskalender

      7. december, 2020

      CSS/SCSS

      Variable fonte med dansk tegnsæt i open source

      11. august, 2019

      CSS/SCSS

      Progressbar for dokumentposition

      31. juli, 2019

      CSS/SCSS

      Media Query i 2019

      18. juli, 2019

      CSS/SCSS

      Danske Adressers Web API

      17. juli, 2019

  • C#
    • C#

      Authentication for IOS og Android med Firebase i…

      4. oktober, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 3

      5. september, 2019

      C#

      Hurtig eksport til Excel

      4. september, 2019

      C#

      Andersen, Grundtvig, Kierkegaard og ML.NET – del 2

      2. september, 2019

      C#

      Andersen, Grundvig, Kierkegaard og ML.NET – del 1

      11. august, 2019

Populære indlæg

  • 1

    Stylometri i C# – del 2

    7. juni, 2019
  • 2

    Send email fra Javascript med Gmail API

    21. juni, 2019
  • 3

    Andersen, Grundvig, Kierkegaard og ML.NET – del 1

    11. august, 2019
  • 4

    Gmail, Yahoo og Outlook som SMTP-server

    18. april, 2019
  • 5

    Registrer Gmail API til brug i javascript

    27. juni, 2019
@2019 - Euromind.com - Code-To-Go. All Right Reserved.
lindsoe@gmail.com - mobil: 42797273

Læs ogsåx

Navngivne RegEx-grupper i ECMAScript 2018

29. juli, 2019

Ikonfarver og brands

24. maj, 2019

Danske Adressers Web API

17. juli, 2019