8 Mar

Kontrollera personnummer – varför ska det va så svårt?

Felaktigt personnummer. Ange personnummer som…

Logga in, skapa konto, ansök osv. Dom flesta av oss använder personnummer på olika webbplatser med jämna mellanrum, men det känns som det finns väl många olika sätt att ange det på. Jag brukar börja med 790314NNNN – det fungerar ibland och ibland inte. Kanske har jag blivit avtrubbad och accepterar att jag skriver fel minst en gång för att sedan ändra till korrekt format. Men det borde vara enklare!

TL; DR

  • Låt användaren själv bestämma hur personnumret ska anges. Använd regular expression: ^(19|20)?[0-9]{6}[- ]?[0-9]{4}$ för att kontrollera personnummer. Bör räcka för de flesta. Se slutet för en mer utförlig validering.
  • Omvandla till det format du behöver utan att användaren av tjänsten behöver lida.
  • Risker med detta är förväxling mellan personer under 15 år och över 100 och att ett man inte kan vara säker på om det angivna faktiskt är ett personnummer så om det är viktigt bör man säkra det ytterligare.

För dom flesta tjänster jag använder finns det inget rimligt alternativ. Jag kan inte välja att ansöka om föräldrapenning någon annanstans och Mobilt Bank ID är så pass bra ändå så jag accepterar att jag skriver fel varje gång. Men för många tjänster kan det, i bästa fall, leda till irritation hos kunder och i värsta fall innebära förlorad försäljning. Jag vet också hur svårt det kan vara och har gjort ”fel” många gånger i skapandet av webbtjänster när det gäller användarupplevelsen och personnummer.

Det finns två delar att ta ställning till. Enkelheten för besökaren och behovet av ett korrekt personnummer (mer om det längre ner). Jag har tittat en del på hur några gör utifrån det.

Några exempel

Mobil Bank ID

När man vill använda Mobilt Bank ID krävs det att man anger personnummer i formatet ÅÅÅÅMMDDNNNN 12 siffror. Inga mellanslag eller bindestreck tillåts. Det verkar inte ske någon kontroll för rimligheten i övrigt. Jag provade med 19791314-NNNN (det finns ingen månad 13) och då fungerade det att komma vidare, men det gav ett tekniskt fel på nästa sida.

felmeddelande från Mobilt Bank ID när personnummer har fel format
Mobilt Bank ID när personnummer har fel format

Binero

Binero har valt att förformatera rutan med ÅÅMMDD-NNNN (10 siffror), och rutan använder automatiskt bindestreck. För mig blir det rätt eftersom jag brukar ange mitt personnummer med 10 siffror. Men om man inte kollar ordentligt och börjar ange i samma format som för Bank ID blir resultatet att de två sista siffrorna inte får plats, Binero verkar, likt Bank ID, inte kontrollera rimligheten i övrigt. Mitt felaktiga nummer ger inget felmeddelande,

Personnummerfält på binero.se
Binero när personnummer inte anges på tänkt sätt.

Unionen

Har man glömt sitt lösenord till Unionens webbplats kräver dom formatet ÅÅMMDDNNNN och har låst fältet till 10 tecken. Om man anger personnummer i formatet ÅÅÅÅMMDD-NNNN blir resultatet som nedan.

Unionen verkar ha gått ganska långt i sin kontroll av rimligheten. Min (kanske för korta) undersökning tycks visa att dom kontrollerar både att datumet (månad och dag) är rimliga samt att kontrollsiffran stämmer. Men dom verkar ha missat (eller bortsett ifrån) det sk. samordningsnumret.

Personnummerfält med felmeddelande på Unionens hemsida
Felmeddelande vid fel format på personnummer på Unionens hemsida

Att göra det enkelt att fylla i personnummer verkar det vara fler än jag som har bråkat med, men eftersom det är så vanligt känns det som att det borde finnas större likheter mellan olika webbplatser.

Två mer tillåtande exempel – Telge Energi och Umeå Energi

Telge Energis webbplats tillåter man att personnummer anges på en mängd olika sätt och omvandlar det direkt i rutan till det format som Telge Energi vill ha. Troligen för att det ska fungera med den tjänst som hämtar övriga personuppgifter automatiskt.

Personnummerinmatning på telege Energis webbplats
Ett bra exempel på användarupplevelse vid personnummerinmattning från Telge Energis webbplats

När man ska bli elhandels kund hos Umeå Energi (min arbetsplats) tillåts personnumret  både med 10 eller 12 siffror och med eller utan bindestreck.

Olika varianter av perssonummer på Umeå Energis webbplats
Personnummer i olika format på Umeå Energis webbplats.

Både Umeå Energi och Telge Energi verkar varit noga med att kontrollera rimligheten och båda tillåter mitt fiktiva, men korrekt formatterade, samordningsnummer 8003821454.

Varför är det svårt?

Andra system

Andra datasystem tror jag ofta är ett problem. När det finns ett system som ska få personnumret från webbplatsen är det enklast att låta användaren ange personnumret i det formatet direkt. Att omvandla ett ”felaktigt” personnummer kräver en större insats från programmerare och blir därför dyrare och prioriteras kanske bort, men det är att skjuta problemet åt fel håll. Användaren ska gå först. Det kanske finns tillfällen när det inte är möjligt, men jag kan inte komma på något.

Korrekt personnummer

En annan svårighet som uppstår är vad som kan anses vara ett korrekt personnummer och hur det kan anges på en mängd olika sätt. Ett korrekt personnummer enligt skatteverket är alltid 10 siffror med ett – (bindestreck). Bindestrecket byts ut mot ett + (plustecken) om personen är över hundra år gammal. Skatteverket anger också ett format med 12 siffror utan bindestreck (ÅÅÅÅMMDDNNNN) som används i vissa datasystem (sk. ADB-stödda).

Så här ser det normalt ut:

År Månad Dag avdelare Födelsenummer Kontrollsiffra
Fomat ÅÅ MM DD - (+) NNN N
Exempel 64 08 23 - 323 4
Kan vara högre än 31  (se nedan) Plustecken innebär att personen är över 100 Udda för man och jämn för kvinna. Kontrollsiffra för att se om övriga personnumret har rätt format.

Varianter av personnummer

Finns det annat man måste ta hänsyn till när man ska kontrollera personnummer? Jag har ibland hört talas om personnummer med en bokstav bland de fyra sista siffrorna : ÅÅMMDD-(b)NNN.  Jag hittade två referenser till det vid en snabb googling. I en utredning på riksdagen.se om hur man ska hantera att vissa nummer håller på att ta slut, och i en del referenser till något universitetssystem. Men eftersom skatteverket inte skriver något om detta förutsätter jag att det inte finns.

Så den enda faktiska variant av personnummer verkar vara ett sk. samordningsnummer som används t.ex. när en person inte ska vara folkbokförd. Skillnaden mot ett riktigt personnummer är att siffran för födelsedag då ökas med 60 så att den kan bli mellan 61 och 91.

Så hur ska man göra på webbplatsen?

Jag tycker att att man kan vara ganska tillåtande när ett personnummer ska anges. Det är ändå ganska enkelt att omvandla bakom till ett format som passar. Följande format tycker jag att man bör tillåta:

  • 19ÅÅMMDD-NNNN
  • 20ÅÅMMDD-NNNN
  • ÅÅMMDD-NNNN
  • 19ÅÅMMDDNNNN
  • 20ÅÅMMDDNNNN
  • ÅÅMMDDNNNN
  • 19ÅÅMMDD NNNN
  • 20ÅÅMMDD NNNN
  • ÅÅMMDD NNNN

Detta regular expresssion bör vara tillräckligt i många fall. Men kontrollerar inte rimligheten alls.
^(19|20)?[0-9]{6}[- ]?[0-9]{4}$

Vill Man ta det ett steg till kan man använda denna som då också tillåter mellanslag mellan årtal, månad respektive dag. Den kontrollerar också att månad är mellan 01 och 12 och att dag är mellan 01 och 31. Den tar även hänsyn till samordningsnummer (dag mellan 61 och 91).
^(19|20)?[0-9]{2}[- ]?((0[0-9])|(10|11|12))[- ]?(([0-2][0-9])|(3[0-1])|(([7-8][0-9])|(6[1-9])|(9[0-1])))[- ]?[0-9]{4}$
(Se till att testa innan ni använder den, jag är ingen expert på reg ex)

Risker med detta och annat att fundera över

Genom att validera personnumret så här riskerar man förväxling mellan unga och personer över 100. Eftersom det äldsta personen någonsin i Sverige inte blev 114 år kan man nog räkna med att förväxling endast kan uppstå för personer under 15 med personer över 100. Alla måste själva avgöra hur man ska hantera den risken. Enklast är naturligtvis att kräva 12 siffror men det går ju lite mot principen att låta användaren välja format.

När man skapar sin tjänst måste man fundera över hur viktigt ett korrekt personnummer är och vad de värsta resultatet kan bli av ett felaktigt personnummer. De finns många sätt att säkra personnumret mer om man tycker att det behövs. Mina förslag är:

  1. Räkna ut kontrollsiffran för att se om det är ett korrekt personnummer. Det bör räcka i de flesta fall. Wikipedia har en bra förklaring till hur det går till.
  2. Använd SPARs tjänst för personnummersökning för att kontrollera om det angivna personnumret stämmer med övriga uppgifter som användaren har skrivit in, t.ex. namn eller postort.

Det känns bra att skapa tjänster där man genom att ange personnummer får övriga uppgifter ifyllda automatiskt och då minskar behovet av övrig validering, men den typen av tjänster är tyvärr inte tillåtna enligt datainspektionen.

Mer om personummer

http://www.riksdagen.se/

http://www.skatteverket.se/

https://www.skatteverket.se pdf

http://owaspsweden.blogspot.se/2009/10/dds-programmera-med-personnummer-del-2.html

Kommentera