Sjekk om det er et gyldig norsk personnummer med PowerShell

Innledning

Alle i Norge har et personnummer, noe som mange synes er ok. Mens andre er ikke så spesielt glad i det. Den er på 11 sifre.

Men hva er et personnummer? I Norge bruker man ofte fødselsnummer ikke personnummer, fordi personnummer er de fem siste sifre. Mens for et
fødselsnummer inneholder fødselsdato og de resterende sifre.

Jeg bruker konsekvent personnummer ikke fødselsnummer videre. Siden for meg er jeg så vant med å si personnummer ikke fødselsnummer .

Men hva består personnummer av? De seks første er dag måned og år (DD-MM-ÅÅ). Noe som betyr på et problem. Siden en født og en over hundre år kan få samme personnummer.

Videre har vi fem ekstra numre. Siffer nummer syv er hvilket århundre man er født. Siffer nummer ni forteller om kjønnet. Mens resten er kontroll sifre.

Dette skript er laget ut fra et lite oppgave jeg fikk i 1987 på datateknisk, skrevet da i Pascal.

Har endret koden fra Pascal og kan nå kjøres i PowerShell.

Kode

# powershell -ExecutionPolicy ByPass -File .\YTDownloadList.ps1 -pnr

    param (
          [string]$pnr = ''
			)

	function Is-Numeric ($Value)
	{
		return $Value -match "^[\d\.]+$"
	}

	function IsNegative ([double]$Number) {
		$Number.ToString().StartsWith('-')
	}

	if (($pnr.length -eq 11) -and (Is-Numeric($pnr) -eq 'True') ) {

	$s1 = [int]$pnr[0]-48
	$s2 = [int]$pnr[1]-48
	$s3 = [int]$pnr[2]-48
	$s4 = [int]$pnr[3]-48
	$s5 = [int]$pnr[4]-48  
	$s6 = [int]$pnr[5]-48
	$s7 = [int]$pnr[6]-48
	$s8 = [int]$pnr[7]-48
	$s9 = [int]$pnr[8]-48
	$s10 = [int]$pnr[9]-48
	$s11 = [int]$pnr[10]-48

	$year = (Get-Date).year

	$pnr_year = $s5 * 10 + $s6

	if ($s7 -gt 4){$age = $year -(2000 + $pnr_year)} else {$age = $year -(1900+$pnr_year)}  # vil anta at det er ikke mange født 1800 derfor bruker man 2000
	if ($s9 % 2 -eq 0) { $gender = 'kvinne' } else {$gender = 'mann' }

	$error = 0
	$rest1 = ($s1*3 + $s2*7 + $s3*6 + $s4 + $s5*8 + $s6*9 + $s7*4 + $s8*5 + $s9*2) % 11

	if ($rest1 -eq 1) {$error =1} 

	if ($rest1 -eq 0 )
	{	if ($s10 -ne 0 ) {$error = 1} 
	}
		if ($rest1 -ne 0 -and $rest1 -ne 1) 
		{
			$t = 11 - $rest1
			if ($s10 -ne $t) {$error = 1} 
		}


	$rest2 = ($s1*5 + $s2*4 + $s3*3 + $s4*2 + $s5*7 + $s6*6 + $s7*5 + $s8*4 + $s9*3+$s10*2) % 11

	if ($rest2 -eq 1) {$error =1} 

	if ($rest2 -eq 0 )
	{	if ($s11 -ne 0 ) {$error = 1} 
	}

		if ($rest2 -ne 0 -and $rest2 -ne 1) 
		{
			$t = 11 - $rest2
			if ($s11 -ne $t) {$error = 1} 
		}

		if ($error -eq 1) { $personText = 'ikke korrekt personnummer' } else {$personText = 'korrekt personnummer'} 

		if (IsNegative($age) -eq 'True' ) 
		{write-output('Du er ikke født ennå')}
		else 
		{write-host('Ditt kjønn er '+$gender+' og er '+$age+' år gammel. Og du har '+$personText)
	}

	}else
	{write-host('Vennligst skriv inn korrekt personnummer lengde og kun numre')}             

Ser man på koden legger man merke til at rest1 relaterer seg til siffer ti. Mens rest2 referer til siffer elleve.

Formel for rest 1 relatert til siffer ti

rest1 = (s1 · 3 + s2 ·7 + s3 · 6 + s4 + s5 · 8 + s6 · 9 + s7 · 4 + s8 · 5 + s92· ) mod 11

Formel for rest 2 relatert til siffer elleve

rest2 = (s1 · 5 + s2 ·4 + s3 · 3 + s4 · 2 + s5 · 7 + s6 · 6 + s7 · 5 + s84· + s93· +s10· 2 ) mod 11

Jeg husker at det ble nevnt at åttende siffer har noe informasjon. Men det ble ikke avdekket der og da.

Det kan kun gjør er å skrive inn alle elve sifre og trykk enter

powershell -ExecutionPolicy ByPass -File .\YTDownloadList.ps1 -pnr xxxxxxxxxxx

PS! Har ikke brydd meg med æøå problematikk. Det vil jeg ta på et senere tidspunkt-

Koden kan lastet ned her.

Frontbilde av rawpixel (Unsplash)