webForumDet fria alternativet

Personnummer

3 svar · 1 011 visningar · startad av aleborg

aleborgMedlem sedan jan. 20013 341 inlägg
#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# :(

PMedlem 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))
GuffaMedlem 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;
}
GuffaMedlem 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;
}
126 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)