Verification rib avec modulo 97

Soyez le premier à donner votre avis sur cette source.

Vue 14 314 fois - Téléchargée 576 fois

Description

Vérification de la clé RIB avec Modulo 97, après recherche je n'ai trouvé que des bout de code en Visual ou C alors je suis parti d?une source posé ici en en langages C. Dans la conversion de chiffre en lettre je reformate les chiffres ca me permet de saisir un RIB que dans un champ avec des espaces ou tiret.

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Controls, Forms, Buttons, StdCtrls, ExtCtrls,
  Classes;

type
  TFiche = class(TForm)
    EBANQUE: TEdit;
    EGUICHET: TEdit;
    ECOMPTE: TEdit;
    ERIB: TEdit;
    L1: TLabel;
    L2: TLabel;
    L3: TLabel;
    L4: TLabel;
    L5: TLabel;
    BT1: TBitBtn;
    VRIB: TLabel;
    ECOMPTEENTIER: TEdit;
    BT2: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure BT1Click(Sender: TObject);
    function LettreEnChiffre(_In: string): string;
    procedure EBANQUEKeyPress(Sender: TObject; var Key: Char);
    procedure ERIBKeyPress(Sender: TObject; var Key: Char);
    procedure ECOMPTEKeyPress(Sender: TObject; var Key: Char);
    procedure BT2Click(Sender: TObject);
    procedure ECOMPTEENTIERKeyPress(Sender: TObject; var Key: Char);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Fiche: TFiche;

implementation

{$R *.dfm}

//---- Conversion d'un numéro de compte chiffres et lettres en chiffres --------

function TFiche.LettreEnChiffre(_In: string): string;
var
  i: Integer;
  Chaine: string;
begin
  for i := 1 to Length(_In) do
  begin
    Chaine := Copy(_In, i, 1);
    case Chaine[1] of
    // Le reformatage des chiffres sert à la solution 2
      '0': Result := Result + '0'; // * table de conversion lettre-chiffre pour le RIB :
      '1', 'A', 'J': Result := Result + '1'; // A, J = 1
      '2', 'B', 'K', 'S': Result := Result + '2'; // B, K, S = 2
      '3', 'C', 'L', 'T': Result := Result + '3'; // C, L, T = 3
      '4', 'D', 'M', 'U': Result := Result + '4'; // D, M, U = 4
      '5', 'E', 'N', 'V': Result := Result + '5'; // E, N, V = 5
      '6', 'F', 'O', 'W': Result := Result + '6'; // F, O, W = 6
      '7', 'G', 'P', 'X': Result := Result + '7'; // G, P, X = 7
      '8', 'H', 'Q', 'Y': Result := Result + '8'; // H, Q, Y = 8
      '9', 'I', 'R', 'Z': Result := Result + '9'; // I, R, Z = 9
    end;
  end;
end;
//------------------------------------------------------------------------------

procedure TFiche.BT1Click(Sender: TObject);
var Resultat: Int64;
  Compte: string;
begin
  try
//Convertir Lettre en Chiffre pour le Numéro de compte
    Compte := LettreEnChiffre(ECOMPTE.Text);
//------------------------------------------------------------------------------
  //Code Banque / 97
    Resultat := StrToInt(EBANQUE.Text) mod 97;
  //Resultat * 100000 + Code Guichet / 97
    Resultat := ((Resultat * 100000) + StrToInt(EGUICHET.Text)) mod 97;
  //Resultat * 1000000 + Numero de compte les 6 premier chiffres  / 97
    Resultat := ((Resultat * 1000000) + StrToInt(Copy(Compte, 0, 6))) mod 97;
  //Resultat * 100000 + Numero de compte les 5 Dernier chiffres / 97
    Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 7, 11))) mod 97;
  //Mod (97) - Resultat * 100 / 97 = Cle rib
    Resultat := ((97 - Resultat) * 100) mod 97;
//------------------------------------------------------------------------------
  // Mettre FormatFloat '00' au cas ou que la Cle rib soit inférieure à 10
    VRIB.Caption := FormatFloat('00', Resultat);

    if VRIB.Caption <> ERIB.Text then BT1.Caption := 'RIB False'
    else BT1.Caption := 'RIB True';
  except
    BT1.Caption := 'Saisie Erroné';
    Exit;
  end;
end;

//----- Key Press --------------------------------------------------------------

procedure TFiche.EBANQUEKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser que des chiffres en saisie
  if not (Key in ['0'..'9', #8, #13, #27]) then Key := #0;
// Focus suivant
  if Key = #13 then
  begin
    if Getkeystate(VK_Shift) and $8000 <> 0 then
      Postmessage(Handle, WM_NextDlgCtl, 1, 0)
    else
      Postmessage(Handle, WM_NextDlgCtl, 0, 0);
    Key := #0;
  end;
end;

procedure TFiche.ECOMPTEKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser des chiffres et lettres en saisie
  if not (Key in ['0'..'9', 'a'..'z', 'A'..'Z', #8, #13, #27]) then Key := #0;
// Focus suivant
  if Key = #13 then
  begin
    ERIB.SetFocus;
    Key := #0;
  end;
end;

procedure TFiche.ERIBKeyPress(Sender: TObject; var Key: Char);
begin
// Autoriser que des chiffres en saisie
  if not (Key in ['0'..'9', #8, #13, #27]) then Key := #0;
// Clic sur BT Resultat
  if Key = #13 then
  begin
    BT1.OnClick(nil);
    Key := #0;
  end;
end;
//------------------------------------------------------------------------------
//----- 2eme solutions saisie sur un seul champ avec des espaces ou tiret etc...
//------------------------------------------------------------------------------

procedure TFiche.BT2Click(Sender: TObject);
var Resultat: Int64;
  Compte: string;
begin
  try
//Convertir Lettre en Chiffre pour le Numéro de compte
//vous pouvez saisir des espaces des tiret etc...
    Compte := LettreEnChiffre(ECOMPTEENTIER.Text);
    //Vérification longueur de saisie si different de 23 on sort
    if Length(Compte) <> 23 Then
    begin
    BT2.Caption := 'Saisie Erroné';
    Exit;
    end;
//------------------------------------------------------------------------------
  //Code Banque / 97
    Resultat := StrToInt(Copy(Compte, 1, 5)) mod 97;
  //Resultat * 100000 + Code Guichet / 97
    Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 6, 10))) mod 97;
  //Resultat * 1000000 + Numero de compte les 6 premier chiffres  / 97
    Resultat := ((Resultat * 1000000) + StrToInt(Copy(Compte, 11, 16))) mod 97;
  //Resultat * 100000 + Numero de compte les 5 Dernier chiffres / 97
    Resultat := ((Resultat * 100000) + StrToInt(Copy(Compte, 17, 21))) mod 97;
  //Mod (97) - Resultat * 100 / 97 = Cle rib
    Resultat := ((97 - Resultat) * 100) mod 97;
//------------------------------------------------------------------------------
  // Mettre FormatFloat '00' au cas ou que la Cle rib soit inférieure à 10
    VRIB.Caption := FormatFloat('00', Resultat);
  // Du fait que compte se retrouve formaté en chiffre la position de la clé rib
  // est forcément 22 et 23
    if VRIB.Caption <> Copy(Compte, 22, 23) then BT2.Caption := 'RIB False'
    else BT2.Caption := 'RIB True';
  except
    BT2.Caption := 'Saisie Erroné';
    Exit;
  end;
end;
//----- Key Press --------------------------------------------------------------

procedure TFiche.ECOMPTEENTIERKeyPress(Sender: TObject; var Key: Char);
begin
// Clic sur BT2 Resultat
  if Key = #13 then
  begin
    BT2.OnClick(nil);
    Key := #0;
  end;
end;
//------------------------------------------------------------------------------

end.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_eli42
Messages postés
132
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
12 novembre 2019

Bien vu, faut dire que j'utilise la premiere formule, la deuxieme etait juste la pour faire comprendre mon case, la je dois partir j'ai pas le temps de corriger aujourd'hui pour ceux que ca interesse a la ligne 155 rajouter :

if Length(Compte) <> 23 Then
begin
BT2.Caption := 'Saisie Erroné';
Exit;
end;

Je mettrais le source a jour demain.
Oniria
Messages postés
296
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
18 décembre 2014
2
Bonjour,

J'ai juste un petit commentaire à faire : Que se passe - il si l'utilisateur n'écrit pas tous les champs dans le deuxième cas ? A mon avis, un joli plantage. Essaye d'utiliser try ... except ... end pour les strtoint.
Sinon, pas mal du tout.

Oniriabot

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.