Någon som har lyckats få ihop en funktion för att kolla så att personnummer och organisationsnummer stämmer med kontrollsiffran? Gjorde ett tappert försök för ett tag sen men lyckades inget vidare i C# :(
Personnummer
3 svar · 1 011 visningar · startad av aleborg
Kan bidra med en version i Lisp(Allegro) som vi hade i uppgift i skolan någon gång för att ta ut personnummer:
; Kontrollerar om ett personnummer är korrekt
(defun kontrollera-pnr(l)
(= (kontrollsiffra l ) (hämtasiffra (summera (multiplicera l '() 2)))))
; Multiplicerar en lista med omväxlande 1 och 2
(defun multiplicera(l newlist tal)
(cond
((= (length l) 1) newlist)
(t (multiplicera (rest l) (append newlist (list (* tal (first l)))) (byttal tal)))))
; Summerar en lista
(defun summera(l)
(if (endp l) 0
(+ (split (first l)) (summera (rest l)))))
; Hämtar kontrollsiffran efter uträkning
(defun hämtasiffra(tal)
(if (= (ental tal) 0) 0
(- (* (+ (tiotal tal) 1) 10 ) tal)))
(defun byttal(n) ;Byter ett tal till 1 om det är 2 eller 2 om det är 1
(if (= n 1) 2
1))
(defun kontrollsiffra(l)(first (last l))) ; Hämtar kontrollsiffran
(defun split(tal) ( + (ental tal) (tiotal tal))) ; Delar upp tvåsiffriga tal
(defun ental(tal) (mod tal 10)) ; Tar ut entalsiffran
(defun tiotal(tal) (truncate (/ (mod tal 100) 10))) ; Tar ut tiotals siffran
; Om tredje siffran är ojämn=man jämn=kvinna
(defun kon-pnr(l)
(if (oddp (second (reverse l))) 'man
'kvinna))
Slängde ihop en lite kort funktion. ;)
bool CheckPersnr(string persnr) {
int s=0,d;
if(!(new Regex(@"^\d{10}$")).IsMatch(persnr=persnr.Replace("-",""))) return false;
for(int i=0,m=1;i<10;s+=(d/10)+(d%10))d=((int)persnr[i++]-48)*(m=3-m);
return s%10==0;
}
Rationaliserade bort en variabel. :)
bool CheckPersnr(string persnr) {
int s=0,d;
if(!(new Regex(@"^\d{10}$")).IsMatch(persnr=persnr.Replace("-",""))) return false;
for(int i=0;i<10;s+=(d/10)+(d%10))d=((int)persnr[i]-48)*(1+(++i&1));
return s%10==0;
}