Just nu i M3-nätverket
Gå till innehåll

Kontrollera om kontrollsiffran i personnummer stämmer


MissyMalinto
 Share

Rekommendera Poster

Japp, det är samma sak. Min/max/summa är ju också matrisformler, även om matrisen är en enda vektor.

 

Det är när man råkar skriva en sån formel och ser "procent färdig" ticka låååååångsamt som man börjar kalla sig själv fula saker :wacko: sen börjar man svettas när man inser att man inte sparat bladet på 3 timmar :ph34r:

 

I LibreOffice tickar det dessutom inga procent, det går bara inte att göra något på ett bra tag… om jag inte minns fel, det var ett tag sedan jag gjorde det misstaget nu.

Länk till kommentar
Dela på andra webbplatser

  • 7 years later...

Ett litet inlägg i den långa debatten om Kontrollera Personnummer

Metoden för att räkna ut kontrollsifran i personnummret kallas för
Luhnalgoritmen (Hans Peter Luhn på IBM), även kallad modulus-10-algoritmen.
Varannan siffra multipliceras med 2. Om resultatet blir 10 eller mer tas tvärsumman.

I min matteskola fick man lära sig att det gör man enklast med KVOT och REST för
att få heltalet resp. det som blir över.
EX.  45  KVOT(45;10) ger 4,  REST(45;10) ger 5.

Min formel för beräkning Pnr: blir därför:
Ta bort ev. bindestreck först med  BYT.UT(A1;"-";"")

=REST(10-(REST(KVOT(EXTEXT($A1;1;1)*2;10)+REST(EXTEXT($A1;1;1)*2;10)+
EXTEXT($A1;2;1)+
KVOT(EXTEXT($A1;3;1)*2;10)+REST(EXTEXT($A1;3;1)*2;10)+
EXTEXT($A1;4;1)+
KVOT(EXTEXT($A1;5;1)*2;10)+REST(EXTEXT($A1;5;1)*2;10)+
EXTEXT($A1;6;1)+
KVOT(EXTEXT($A1;7;1)*2;10)+REST(EXTEXT($A1;7;1)*2;10)+
EXTEXT($A1;8;1)+
KVOT(EXTEXT($A1;9;1)*2;10)+REST(EXTEXT($A1;9;1)*2;10);10));10)

Obs: att den siffran som multipliceras med 1 tar man bara ut med EXTEXT.
När man sedan har fått en slutsumma skall den behandlas.

Får man en slutsumma t.ex 44 så blir kontrollsiffran närmast högre heltal d.v.s 50-44=6
eller om man så vill 10-4.
I EXCEL enkelt med formeln =REST(10-REST(44;10);10)
OBS:  2 REST funktioner p.g.a att om slutsumman är jämt 10-tal skall kontrollsiffran bli 0 och inte 10.

Samma sak gäller även för Monshis fina funktion i VBA
KontrolleraKontrollsiffra = ((10 - (summa - Int(summa / 10) * 10)) = temp)
bör eg.  vara
KontrolleraKontrollsiffra = ((10 - summa Mod 10) Mod 10 = rest)

MH_:s formel med produktsumma verkar också fungera.

Länk till kommentar
Dela på andra webbplatser

Här är en rutin för Personnr: som är kortast av alla jag hittills sett och som jag hitta på ett forum på nätet.
Har konfererat med MH_  och han tyckte den var snygg och borde publiceras här på eforum.
Här är den som ger kontrollsiffran
=REST(10-(SUMMA(RUNDA.UPP(REST(EXTEXT(A1;{1;2;3;4;5;6;7;8;9};1)*{2;1;2;1;2;1;2;1;2};9,5);1)));10).
Persionnummer i ruta A1 utan bindestreck.

Det som är problemet är ju tvärsumman när multiplikation med 2 blir 10 eller mer
Det är talen 5, 6, 7, 8, 9 d.v.s 10, 12, 14, 16 och 18. 
En rutin i excel som fixar tvärsumman på ett elegant sätt är med den sällan använda funktionen
REST med 9,5  och sedan RUNDA.UPP med 1   =RUNDA.UPP(REST("temp";9,5);1).
Den ger 1, 3, 5, 7 och 9 på 10, 12, 14, 16 och 18.
Som ex. Delar man 12 med 9,5 blir det kvar 2,5. RUNDA.UPP med 1 ger då 3, = tvärsumman.
Allt i formeln handlar om REST. 
Det är kanske därför det heter modulos-formeln när man ska beräkna kontrollsiffran.  
REST heter MOD på engelska.
9,5 kan variera med något mellan 9 och 10. (9,5 är taget mittimellan)

Tar man med alla 10 siffror ger denna rutin SANT eller FALSKT på personnummret. MH_:s tillägg.
=REST(10-(SUMMA(RUNDA.UPP(REST(EXTEXT(A1;{1;2;3;4;5;6;7;8;9;10};1)*{2;1;2;1;2;1;2;1;2;1};9,5);1)));10)=0

Skall man kunna kolla även med bindesteck i Pnr får man lägga till så att det blir

=REST(10-(SUMMA(RUNDA.UPP(REST(EXTEXT(BYT.UT(A1;"-";"");{1;2;3;4;5;6;7;8;9;10};1)*{2;1;2;1;2;1;2;1;2;1};9,5);1)));10)=0

Kortare än så blir det knappast i Excel.

LARS G

Länk till kommentar
Dela på andra webbplatser

 Share

×
×
  • Skapa nytt...