function testcprnummerok(cprnummer : string) : byte; var cpr : string; nr : array(.1..10.) of byte; x : byte; verdi : word; tal : byte; code : integer; begin testcprnummerok:=1; cpr:=cleancprnummer(cprnummer);
if length(cpr)<>10 then exit;
for x:=1 to 10 do begin val(cpr(.x.),tal,code); nr(.x.):=tal; end; verdi:=4*nr(.1.)+3*nr(.2.)+2*nr(.3.)+7*nr(.4.)+6*nr(.5.)+5*nr(.6.)+ 4*nr(.7.)+3*nr(.8.)+2*nr(.9.)+nr(.10.);
if verdi mod 11<>0 then testcprnummerok:=2 else testcprnummerok:=3; end;
Kontrolcifferberegning ved brug af modulus 11 CPR-kontoret Dato: 14/06/2006 Beregning af kontrolciffer
Ni første tal 0 7 0 7 6 1 4 2 8
gange med x x x x x x x x x
hver deres værdi 4 3 2 7 6 5 4 3 2
giver 00+ 21+ 00+ 49+ 36+ 05+ 16+ 06+ 16
sammenlagt giver disse tal 149
149 delt med 11 giver 13 med en rest på 6
Kontrolcifret beregnes ved at trække resten 6 fra 11.
Kontrolcifret bliver i dette tilfælde 5 og det 10-cifrede nummer bliver 07 07 61-4285.
Hvis resten bliver 1 skulle kontrolcifret efter metoden være 10. Da 2-cifrede kontroltal ikke accepteres, kan kontrolcifrene i sådanne tilfælde ikke benyttes.
Kontrolberegning af et nummer med kontrolciffer
De 10 tal 0 7 0 7 6 1 4 2 8 5 ganget med x x x x x x x x x x hver deres værdi 4 3 2 7 6 5 4 3 2 1 giver 00+ 21+ 00+ 49+ 36+ 05+ 16+ 06+ 16+ 05
sammenlagt giver disse tal 154
154 delt med 11 giver 14 og ingen rest.
Når 11 går op i 154 og der derved ingen rest findes, er kontrolberegningen i orden. Ellers er kombinationen af de 10 cifre i nummeret forkert.
ok, jeg var lidt for hurtig så her er en der returnere en boolean:
function CprNummerOK(CprNr : string) : boolean; var nr : array(.1..10.) of byte; x : byte; verdi : word; tal : byte; code : integer; begin Result:=false;
for x:=Length(CprNr) downto 1 do if not (upcase(CprNr(.x.)) in (.'0'..'9','A'..'Z'.)) then delete(CprNr,x,1);
if Length(CprNr)<>10 then exit;
for x:=1 to 10 do begin val(CprNr(.x.),tal,code); nr(.x.):=tal; end; verdi:=4*nr(.1.)+3*nr(.2.)+2*nr(.3.)+7*nr(.4.)+6*nr(.5.)+5*nr(.6.)+ 4*nr(.7.)+3*nr(.8.)+2*nr(.9.)+nr(.10.);
if verdi mod 11<>0 then exit;
Result:=true; end;
----------------------------
if not CprNummerOK('120570-1235') then showmessage('nej, ikke gyldig'); end;
Mht. om man benytter Result= eller CprNummerOK= så er der ingen forskel, den første function jeg postede var en gammel en fra dengang (for mange år siden i Borland pascal) hvor der ikke var noget der hed Result.
Glem den første funktion og brug den anden. Virker det ikke på din computer hvis du benytter (. i stedet for [ ? I min Delphi 7 kan jeg benytte begge dele.
Jeg fandt functionen CalculateAge på Torry. Husk at tilføje DateUtils til din uses.
------------------------
function CalculateAge(Birthday, CurrentDate: TDate): Integer; var Month, Day, Year, CurrentYear, CurrentMonth, CurrentDay: Word; begin DecodeDate(Birthday, Year, Month, Day); DecodeDate(CurrentDate, CurrentYear, CurrentMonth, CurrentDay);
if (Year = CurrentYear) and (Month = CurrentMonth) and (Day = CurrentDay) then begin Result := 0; end else begin Result := CurrentYear - Year; if (Month > CurrentMonth) then Dec(Result) else begin if Month = CurrentMonth then if (Day > CurrentDay) then Dec(Result); end; end; end;
function CprNummerOK(CprNr : string; var Alder : integer) : boolean; var nr : array[1..10] of byte; x : byte; verdi : word; Dato : TDate; begin Result:=false;
for x:=Length(CprNr) downto 1 do if not (upcase(CprNr[x]) in ['0'..'9','A'..'Z']) then delete(CprNr,x,1);
if Length(CprNr)<>10 then exit;
for x:=1 to 10 do Nr[x]:=StrToIntDef(CprNr[x],-1);
// TwoDigitYearCenturyWindow:=50; Dato:=StrToDate(Copy(CprNr,1,2)+DateSeparator+Copy(CprNr,3,2)+DateSeparator+Copy(CprNr,5,2)); if Dato>Date then Dato:=IncYear(Dato,-100); Alder:=CalculateAge(Dato,Date); end;
var Alder : integer; begin if not CprNummerOK(Edit1.Text,Alder) then Showmessage('Nej, ugyldig cpr nummer') else Showmessage('OK. Alder er: '+IntToStr(Alder)); end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.