Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 41

Thread: IBAN generator

Hybrid View

  1. #1

    IBAN generator

    Hallo,

    Ik heb een code om een IBAN nummer te controleren:

    Code:
    function ChangeAlpha(input: string): string;
    var
      a: Char;
    begin
      Result := input;
      for a := 'A' to 'Z' do
      begin
        Result := StringReplace(Result, a, IntToStr(Ord(a) - 55), [rfReplaceAll]);
      end;
    end;
    
    function CalculateDigits(iban: string): Integer;
    var 
      v, l: Integer;
      alpha: string;
      number: Longint;
      rest: Integer;
    begin
      iban := UpperCase(iban);
      if Pos('IBAN', iban) > 0 then
        Delete(iban, Pos('IBAN', iban), 4);
      iban := iban + Copy(iban, 1, 4);
      Delete(iban, 1, 4);
      iban := ChangeAlpha(iban);
      v := 1;
      l := 9;
      rest := 0;
      alpha := '';
      try
        while v <= Length(iban) do
        begin
          if l > Length(iban) then
            l := Length(iban);
          alpha := alpha + Copy(iban, v, l);
          number := StrToInt(alpha);
          rest := number mod 97;
          v := v + l;
          alpha := IntToStr(rest);
          l := 9 - Length(alpha);
        end;
      except
        rest := 0;
      end;
      Result := rest;
    end;
    
    function CheckIBAN(iban: string): Boolean;
    begin
      iban := StringReplace(iban, ' ', '', [rfReplaceAll]);
      if CalculateDigits(iban) = 1 then
         Result := True
        else
         Result := False;
     end;
    Nu wil ik als ik button1 klik, dat dan de IBAN in Edit1 gecontroleerd wordt of hij juist is en dat dit dan word weergegeven in Edit2 (juist of niet juist).

    Onder button1 heb ik:
    Code:
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    CheckIBAN(Edit1.Text);
    Result: edit2.Text;
    end;
    Dit werkt helaas niet. Iemand een oplossing?

  2. #2
    Weet je ook waarom dat niet werkt? CheckIBAN is een functie die een boolean als resultaat teruggeeft, dat moet je dan gebruiken om de juiste tekst in edit2 te zetten (al zou ik daarvoor een TLabel gebruiken)
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  3. #3
    tlabel vind ik ook prima.

    Zou je even voor kunnen doen hoe het moet....ben namelijk al lang mee bezig...Bedankt

  4. #4
    Code:
    procedure TForm3.Button1Click(Sender: TObject);
    var
    Result: Integer;
    begin
    CheckIBAN(Edit1.Text);
    If result := true then
    Label1.Caption = 'juist';
    end;
    Werkt ook niet....

  5. #5
    CheckIban is een Booleaanse functie je kan het resultaat ervan direct gebruiken in je IF functie dus :

    Code:
    If checkIBAN(Edit1.Text) Then Label1.Caption := 'Juist !'
    Onder Button1 gaat hij 'Result' niet meer kennen, of toch zeker niet als het resultaat van je functie.

  6. #6
    met := ken je een waarde toe aan een variabele of result en alleen een = is een vergelijking. Misschien dat dit je wat op weg helpt.

  7. #7
    If CheckIBAN(Edit1.Text) then
    Label1.Caption = 'juist';

    Werkt dit ook niet ?
    Kunnen wij het maken, nou en of !

  8. #8
    Bovendien is result van het type integer en dat kan je niet vergelijken met een boolean.
    Als ik jou was zou ik dit ff laten liggen en "back to basics (of is het BASIC)" gaan, het is duidelijk nog te hoog gegrepen
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  9. #9
    Quote Originally Posted by buzz123 View Post
    Hallo,
    Ik heb een code om een IBAN nummer te controleren:
    Die code heb je natuurlijk ergens gevonden. Altijd verstandig deze even goed te lezen kijken of je deze begrijpt. feitelijk staat de oplossing op jou vraag al in de code van je IBANnummer controle... (en nu eens kijken of je het verband kan leggen...)
    Brouwvisie is helemaal mijn ding
    http://www.bier-brouwer.nl

  10. #10
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Mijn nederlandse iban versie.
    Wie kan het korter, sneller, beter?

    delphi Code:
    1. function CalcMod(const LargeNumber: string): Integer;
    2. var
    3.   P, Len: Integer;
    4.   Alpha: string;
    5.   C: Char;
    6.   Rest: Integer;
    7. begin
    8.   // validate digits
    9.   for C in LargeNumber do
    10.     if not TCharacter.IsDigit(C) then
    11.       Exit(0);
    12.   // calculate
    13.   P := 1;
    14.   Len := Min(Length(LargeNumber), 9);
    15.   Rest := 0;
    16.   Alpha := '';
    17.   while P <= Length(LargeNumber) do
    18.   begin
    19.     Alpha := Alpha + Copy(LargeNumber, P, Len);
    20.     Rest := StrToInt(Alpha) mod 97;
    21.     Inc(P, Len);
    22.     Alpha := IntToStr(Rest);
    23.     Len := 9 - Length(Alpha);
    24.   end;
    25.   Result := Rest;
    26. end;
    27.  
    28. function IsIban(const S: string): Boolean;
    29. // check dutch iban: NL49RABO0123456789
    30. var
    31.   H, Encoded: string;
    32.   C: Char;
    33. begin
    34.   if Length(S) <> 18 then
    35.     Exit(False);
    36.   // put first 4 behind
    37.   H := UpperCase(Copy(S, 5, Length(S)) + Copy(S, 1, 4));
    38.   // replace letters with digits (A = 10, B = 11 etc)
    39.   Encoded := '';
    40.   for C in H do
    41.     if TCharacter.IsLetter(C) then
    42.       Encoded := Encoded + IntToStr(Ord(AnsiChar(C)) - 55)
    43.     else
    44.       Encoded := Encoded + C;
    45.   Result := CalcMod(Encoded) = 1;
    46. end;

  11. #11
    Toevallig afgelopen maandag gemaakt. Ik zoek 'm vanavond op. Die valideert overigens niet alleen Nederlandse.
    1+1=b

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Altijd leuk dit soort kleine uitdaginkjes
    Hier is mijn versie (werkt voor alle landen):
    Delphi Code:
    1. Function StrMod97(S : String) : String;
    2. Var
    3.   P : Integer;
    4. Begin
    5.   Result := Copy(S, 1, 8);
    6.   P := Length(Result);
    7.   While (P < Length(S)) Do
    8.     Begin
    9.       Result := IntToStr(StrToIntDef(Result, 0) Mod 97) + Copy(S, Succ(P), 6);
    10.       Inc(P, Length(Result) - 2);
    11.     End;
    12.   Result := IntToStr(StrToIntDef(Result, 0) Mod 97);
    13. End;
    14.  
    15. Function CheckIBAN(Const AIBAN : String) : Boolean;
    16. Var
    17.   C : String;
    18.   I : Integer;
    19.   S : String;
    20. Begin
    21.   C := Copy(AIBAN, 5, Length(AIBAN)) + Copy(AIBAN, 1, 4);
    22.   S := '';
    23.   For I := 1 To Length(C) Do
    24.     Case C[I] Of
    25.       ' '      : ;
    26.       '0'..'9' : S := S + C[I];
    27.       'A'..'Z' : S := S + IntToStr(Ord(C[I]) - 55);
    28.     Else
    29.       Raise Exception.CreateFmt('Illegal character "%s" at position %d', [C[I], I]);
    30.     End;
    31.   Result := StrMod97(S) = '1';
    32. End;

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  13. #13
    Toch iets te snel geschreven.
    Inc(P, Length(Result) - 2); klopt niet.

    Voor restwaarde '0' t/m '9' moet het Inc( P, Length( Result) -1); zijn.

  14. #14
    Quote Originally Posted by Hubert View Post
    Toch iets te snel geschreven.
    Inc(P, Length(Result) - 2); klopt niet.

    Voor restwaarde '0' t/m '9' moet het Inc( P, Length( Result) -1); zijn.
    moet ik in die functie StrMod97 gewoon :
    Inc(P, Length(Result) - 2);
    door
    Inc( P, Length( Result) -1);
    vervangen ?

  15. #15
    Wow, Peter, lekker kort.

    Ik vind het alleen wel jammer dat ie een boolean teruggeeft die aangeeft of de code geldig is of niet, en een exception als er ongeldige tekens in staan. Wat is het verschil tussen een verkeerde letter of een ongeldig teken? Ik zou denk ik kiezen om er een procedure van te maken die bij een foute code altijd een exception geeft, of een functie die altijd een result geeft (bijvoorbeeld een enumeration of een int, waar 'ok' 0 is en andere waarden een foutcode betekenen).

    Maar dat zal wel een kwestie van smaak zijn. Ik weet in ieder geval niet of ik de mijne nog durf te posten...
    1+1=b

Page 1 of 3 1 2 3 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •