Her er et eksempel i VB som du nemt kan omskrives: Function check_cpr(ByVal Cprnr) Dim Tal, I, Sum, Rest, Kontroltal, Resultat Cprnr = Cprnr & " " If Val(Cprnr) = 0 Or Len(Cprnr) < 10 Then Resultat = "Mangler data" Else Tal = "432765432" For I = 1 To 9 Sum = Sum + Val(Mid(Cprnr, I, 1)) * Val(Mid(Tal, I, 1)) Next Rest = Sum Mod 11 Kontroltal = 11 - Rest If Rest = 0 Then Kontroltal = 0 Resultat = "Fejl" If Kontroltal = 10 Then Resultat = "Dato og/eller Løbenummerfejl" If Kontroltal = Val(Mid(Cprnr, 10)) Then Resultat = "OK" End If check_cpr = Resultat End Function
Her er et eksempel i VB som du nemt kan omskrives:
Metoden Mid() hedder subString() i java
Function check_cpr(ByVal Cprnr) Dim Tal, I, Sum, Rest, Kontroltal, Resultat Cprnr = Cprnr & " " If Val(Cprnr) = 0 Or Len(Cprnr) < 10 Then Resultat = "Mangler data" Else Tal = "432765432" For I = 1 To 9 Sum = Sum + Val(Mid(Cprnr, I, 1)) * Val(Mid(Tal, I, 1)) Next Rest = Sum Mod 11 Kontroltal = 11 - Rest If Rest = 0 Then Kontroltal = 0 Resultat = "Fejl" If Kontroltal = 10 Then Resultat = "Dato og/eller Løbenummerfejl" If Kontroltal = Val(Mid(Cprnr, 10)) Then Resultat = "OK" End If check_cpr = Resultat End Function
Jeg har ikke lige noget Java program, men dette VB program gør det, og det skulle være meget nemt at omskrive til java, VB's Mid() metode hedder subString() i java
Function check_cpr(ByVal Cprnr) Dim Tal, I, Sum, Rest, Kontroltal, Resultat Cprnr = Cprnr & " " If Val(Cprnr) = 0 Or Len(Cprnr) < 10 Then Resultat = "Mangler data" Else Tal = "432765432" For I = 1 To 9 Sum = Sum + Val(Mid(Cprnr, I, 1)) * Val(Mid(Tal, I, 1)) Next Rest = Sum Mod 11 Kontroltal = 11 - Rest If Rest = 0 Then Kontroltal = 0 Resultat = "Fejl" If Kontroltal = 10 Then Resultat = "Dato og/eller Løbenummerfejl" If Kontroltal = Val(Mid(Cprnr, 10)) Then Resultat = "OK" End If check_cpr = Resultat End Function
String tal = "432765432"; int sum=0; int rest=0; int kontrolTal=0; for(int x=1;x<9;x++) { sum+=Integer.parseInt(cpr.substring(x,x+1))*Integer.parseInt(tal.substring(x,x+1)); }
bearhugx: Jeg kunne ikke nære mig for at kigge på dine venners 13 tals opgave. Den er ret spøjst på et par områder.
De beskriver kraftigt XP, men bryder samtidigt x-antal andre design patterns, f.eks. har de extremt hård kobling imellem design og funktionalitet osv. Lad os håbe de har lært man IKKE blander Java kode og Html.
Man skal huske på at de kun havde haft et 5-mdr kursus i Java først.. De kommer oprindeligt fra C++-verden...
Hvad angår blanding af HTML og Java , så var JSP ikke rigtigt kommet frem endnu - så de lavede servlets (den eneste serverside-tek., de kendte til på det tidspunkt) i stedet...
jeg må dog sige, at jeg også synes det var lidt problematisk at hardkode HTML'en - men det virkede...
bearhugx: Jeg har skam også tænkt mig at læse den lidt nærmere.
Normalt er jeg imod XP da det ikke kan anvendes til den slags store projekter jeg normalt arbejder med, men til dele af de store produkter er det godt til.
Det er lidt mere bøvlet at adskille html og java i en servlet men man kan godt.
Det glæder mig du også synes det er problematisk :)
Her er en CPR-validator, som jeg skulle mene virker
public class CPRValidator { public static boolean isValid(String cpr) { // Test funktionel betingelse if( !(cpr!=null && cpr.length()==10)) return false;
// Test operationel interval long cprNr = Long.parseLong(cpr); if( !(cprNr> 101000000L && cprNr<3112999999L) ) return false;
her er koden, hvor der bliver try-catchet- de steder, hvor en exception kunne forekomme...
public class CPRValidator { public static boolean isValid(String cpr) { // Test funktionel betingelse if( !(cpr!=null && cpr.length()==10)) return false;
Det handler om én konvertering fra String til int[].. i mit hoved giver det mere klarhed oppe i isValid()-metoden, hvis der ikke kommer "forstyrrende elementer" som f.eks. en parseInt og substring ind--
Jeg synes at det er mere klart i min kode, at det handler om at der er et cpr-ciffer, som bliver ganget med et kontrolciffer, og det er summen af det, som bliver mod11 testet....
Hvorimod jeg synes at din kode bærer for meget præg af tal/char-jonglering (parseInt og substring), i stedet for den "vigtige" ting - nemlig multiplikationen...
Selvfølgelig handler dette om _smag_ - og ikke andet ... Min kode laver næsten det samme som din ... Jeg vælger bare at gribe det an med en anden type, int, istedet for String....
Som noget helt anden.. Hvad bruger du det "kontrolTal" til...
Ok .. Din nye tilgang med char[] i stedet for string er pænere :-) - det må jeg tilstå... -- Den vil med det samme blive brugt i min kode -- så slipper jeg også for nfEx'erne...
Min kode begynder (nok ikke overraskende) at ligne din... Jeg mangler bare at finde ud af, hvad du bruger det kontrolTal til...
så vedtager man også med det samme, at alle CPR-nr, som består Mod 11 testen _SKAL_ have 0 som den andetsidste ciffer.... - Og det når man ikke langt med... (mit cpr har f.eks. ikke '0' i 9. position....)
Søren: Det er ikke ment som kritik, det jeg mener er at det er unødvendigt at lave konverteringen på den lidt omstændelige metode. Specielt brugen af try/catch er lidt dårlig rent performance mæssigt.
p.s. Jeg har lige ændret min så det kontroltal forsvinder, og bruger nu char[] istedet for, for at slippe for det String halløj, som jeg gerne vil indrømme er grimt. Men jeg konverterede jo også bare fra VB, jeg havde ikke selv lavet det :)
Men nedenstående version er optimeret og tunet lidt igen :))
nyeste optimerede version:
/* * CPR.java * * Created on 11. juli 2002, 13:44 */
/** * * @author thygesen * @version */ public class CPR {
/** Creates new CPR */ public CPR() { String cpr="2803451977"; System.out.println("Result = "+validateCpr(cpr)); }
Tillykke Disky... Nu kan jeg afsløre, at vores CPR-valideringsmetoder (bortset fra variable-navngivning) er helt ens :-) *LOL*
Når ja.. og så det, at min er en static metode :-)..
I retrospect kan jeg også se, at især de exceptions der kom af konverteringerne ikke var så heldige... - men jeg brød mig ikke om dine parseInt/substring heller...
Men så er det jo godt at vi kan enes omkring char[] istedet :-))
Så er spørgsmålet nu bare om tri kan bruge nogle af vores anstrengelser :-))))
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.