webForumDet fria alternativet

Personnummer

.NET

3 svar · 1 011 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

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# :(

Medlem sedan jan. 20012 204 inlägg
#2

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))
Medlem sedan juni 2004533 inlägg
#3

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;
}
Medlem sedan juni 2004533 inlägg
#4

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;
}
256 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)