IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Algorithme de clé RIB


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Algorithme de clé RIB
    Salut

    Je suis à la recherche d'un algorythme de validation de saise de RIB.
    Je vais partir en quête avec mon ami GOOGLE, mais je voulais poster ici, histoire de dire, si y en a un parmi vous qui déjà ça en VB tout propre, ben ça serait cool, non ?

    Merci d'avance.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tu as de la chance, j'ai justement eu besoin de faire ça il y a quelques semaines... (c'est en C#, je te laisse le soin de convertir)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
            private static Regex regex_rib;
     
            /// <summary>
            /// Vérifie la validité d'un RIB
            /// </summary>
            /// <param name="rib">Le RIB à vérifier</param>
            /// <returns>true si le RIB est valide, false sinon</returns>
            public static bool IsValidRib(string rib)
            {
                // Suppression des espaces et tirets
                string tmp = rib.Replace(" ", "").Replace("-", "");
     
                // Vérification du format BBBBBGGGGGCCCCCCCCCCCKK
                // B : banque
                // G : guichet
                // C : numéro de compte
                // K : clé RIB
                if (regex_rib == null)
                {
                    regex_rib = new Regex(@"(?<B>\d{5})(?<G>\d{5})(?<C>\w{11})(?<K>\d{2})", RegexOptions.Compiled);
                }
                Match m = regex_rib.Match(tmp);
                if (!m.Success)
                    return false;
     
                // Extraction des composants
                string b_s = m.Groups["B"].Value;
                string g_s = m.Groups["G"].Value;
                string c_s = m.Groups["C"].Value;
                string k_s = m.Groups["K"].Value;
     
                // Remplacement des lettres par des chiffres dans le numéro de compte
                StringBuilder sb = new StringBuilder();
                foreach (char ch in c_s.ToUpper())
                {
                    if (char.IsDigit(ch))
                        sb.Append(ch);
                    else
                        sb.Append(RibLetterToDigit(ch));
                }
                c_s = sb.ToString();
     
                // Séparation du numéro de compte pour tenir sur 32bits
                string d_s = c_s.Substring(0, 6);
                c_s = c_s.Substring(6, 5);
     
                // Calcul de la clé RIB
                // Algo ici : http://fr.wikipedia.org/wiki/Clé_RIB#Algorithme_de_calcul_qui_fonctionne_avec_des_entiers_32_bits
     
                int b = int.Parse(b_s);
                int g = int.Parse(g_s);
                int d = int.Parse(d_s);
                int c = int.Parse(c_s);
                int k = int.Parse(k_s);
     
                int calculatedKey = 97 - ((89 * b + 15 * g + 76 * d + 3 * c) % 97);
     
                return (k == calculatedKey);
            }
     
            /// <summary>
            /// Convertit une lettre d'un RIB en un chiffre selon la table suivante :
            /// 1 2 3 4 5 6 7 8 9
            /// A B C D E F G H I
            /// J K L M N O P Q R
            /// _ S T U V W X Y Z
            /// </summary>
            /// <param name="c">La lettre à convertir</param>
            /// <returns>Le chiffre de remplacement</returns>
            public static char RibLetterToDigit(char letter)
            {
                if (letter >= 'A' && letter <= 'I')
                {
                    return (char)(letter - 'A' + '1');
                }
                else if (letter >= 'J' && letter <= 'R')
                {
                    return (char)(letter - 'J' + '1');
                }
                else if (letter >= 'S' && letter <= 'Z')
                {
                    return (char)(letter - 'S' + '2');
                }
                else
                    throw new ArgumentOutOfRangeException("Le caractère à convertir doit être une lettre majuscule dans la plage A-Z");
            }

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci beaucoup, je vais utiliser le site de translation de code C# --> VB pour faire la traduction.

    J'ai juste une petite question annexe sur les RegExpr

    Je ne comprends pas le "<B>" dans ce morceau là "(?<B>\d{5})"

    Faut dire aussi que je suis pas trés fort en RegExpr
    Si j'ai bien suivi, cette RegExpr sert à véririfer qu'il y bien 5 caractères numérique et pas autre chose, donc pas moins de caractère et pas de lettre, c'est ça ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Le <B> signifie le code Banque !
    Le code Banque <B> ne doit effectivement pas dépasser plus de 5 caractères et seulement des numériques.

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    J'ai juste un problème sur cette fonction et vu que je capte pas un broque de C# je vois aps comment m'en sortir.

    Voici le code traduit de la fonction d'origine en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Public Shared Function RibLetterToDigit(ByVal letter As Char) As Char
    		If letter >= "A"c AndAlso letter <= "I"c Then
    			Return CChar((letter - "A"c + "1"c))
    		ElseIf letter >= "J"c AndAlso letter <= "R"c Then
    			Return CChar((letter - "J"c + "1"c))
    		ElseIf letter >= "S"c AndAlso letter <= "Z"c Then
    			Return CChar((letter - "S"c + "2"c))
    		Else
    			Throw New ArgumentOutOfRangeException("Le caractère à convertir doit être une lettre majuscule dans la plage A-Z")
    		End If
    	End Function
    Le problème se pose sur et sur les deux autres lignes pareille.
    Le message est :
    L'opérateur '-' n'est pas défini pour les types 'Char' et 'Char'.
    Sauf je n'ai jamais utilisé ces trucs là et donc je capte rien.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    l'expression "(?<nom>motif)" est un groupe de capture nommé : ça veut dire que la chaine correspondant au motif sera capturé sous le nom nom

  7. #7
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Citation Envoyé par MaT$oN Voir le message
    Le <B> signifie le code Banque !
    Le code Banque <B> ne doit effectivement pas dépasser plus de 5 caractères et seulement des numériques.
    Merci pour ton aide.
    J'avais plus ou moins compris ça pour le <B>, mais je ne comprends pas son utilisation. En gros : est ce que c'est le principe d'une varaible et si oui, comment on la charge ?

    Autre point sur le nombre de caractère : est ce que avec ça je peux définir précisément qu'il faut 5 caractères obligatoire, donc si le champ est vide (dans le cas où je ne mets que ça dans l'expression) me faut il un RequiredFieldValidator en plus ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  8. #8
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    l'expression "(?<nom>motif)" est un groupe de capture nommé : ça veut dire que la chaine correspondant au motif sera capturé sous le nom nom
    Donc en fait, c'est le contraire de ce que j'ai dit ?
    Si je reformule, pour être de bien comrpendre, j'envoi une chaine et dans cette chaine je découpe des trucs et je colle une étiquette à chaque morceaux, j'ai bon ?
    Et donc, plus loin dans mon code je bricole ce que je veux avec mes bouts grâce à leur étiquette. J'ai toujours bon ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre... pourtant C# est généralement plus strict que VB sur les conversions implicites
    Essaie de convertir les char en short pour faire la soustraction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return CChar((CShort(letter) - CShort("A"c) + CShort("1"c)))

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Si je reformule, pour être de bien comrpendre, j'envoi une chaine et dans cette chaine je découpe des trucs et je colle une étiquette à chaque morceaux, j'ai bon ?
    Et donc, plus loin dans mon code je bricole ce que je veux avec mes bouts grâce à leur étiquette. J'ai toujours bon ?
    tout à fait

  11. #11
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Bizarre... pourtant C# est généralement plus strict que VB sur les conversions implicites
    Essaie de convertir les char en short pour faire la soustraction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return CChar((CShort(letter) - CShort("A"c) + CShort("1"c)))
    En fait, en laissant VS travailler un epu, il me dit qu'il préfère ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return CChar(ChrW((CShort(AscW(letter)) - CShort(AscW("A"c)) + CShort(AscW("1"c)))))
    Donc, ne comprenant pas du tout à quoi ça correspond, je le laisse faire.
    Reste plus qu'à trouver un RIB avec des lettres qui tient le route pour faire un test.

    En tout cas, merci pour le coup de main.
    Je fais le test et je boucle.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Effectivement AscW est plus adapté que CShort
    D'ailleurs tu n'as pas besoin de mettre les 2, je pense que tu peux supprimer les CShort

  13. #13
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    euh, j'ai encore un petit souci, mais vuq ue j'ai pas codé à la base, j'avoue être un poil perdu. Mais en plus, je me demande C# ne gère pas différement de VB ce genre de chose.
    Posons le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ' Séparation du numéro de compte pour tenir sur 32bits 
    	Dim d_s As String = c_s.Substring(0, 6)
    	c_s = c_s.Substring(6, 5)
    Là, il me dit :
    L'index et la longueur doivent faire référence à un emplacement situé dans la chaîne.
    Nom du paramètre : length
    Alors, je peux modifier les index, pas trop de soucis, mais j'ai du mal à capter comment il découpe la chaine en deux. Qu'est qu'il mets en premier et qu'est ce qu'il mets en second.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  14. #14
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Toutes mes plus molles excuses pôur cette bourde de débutant.
    il me remonte ce mesage d'erreur aprce que j'ai oublié un quote sur la transformation de la letre en chiffre.
    Déoslé

    Par contre, l'algorythme ne fonctionne pas.

    Je viens de lancer mon premier vrai test avec un RIB qui contient une lettre et il me retroune False.

    Est ce que nos amis AscW n'y serait pas pour quelque chose ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    je me demande C# ne gère pas différement de VB ce genre de chose.
    Certainement pas : la classe String est la même quelle que soit le langage à partir duquel tu l'utilises

    Citation Envoyé par zooffy Voir le message
    j'ai du mal à capter comment il découpe la chaine en deux. Qu'est qu'il mets en premier et qu'est ce qu'il mets en second.
    Ca met les 6 premiers caractères du numéro de compte dans une variable, et les 5 derniers dans une autre. De façon à ce que les nombres représentés par ces chaînes tiennent sur 32bits (cf. le lien dans les commentaires du code)

    A mon avis ton erreur est liée au fait que la chaîne c_s ne fait pas 11 caractères comme prévu... essaie de debugger pas-à-pas

  16. #16
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Bon, je veins de faire des essais avec 4 RIB différents, deux avec lettre et deux sans lettre.

    Ben ça marche pas. Il me remonte toujours False

    Que faire ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Pourtant l'algo est correct, je l'utilise... T'es sûr qu'ils sont bons tes RIB ?
    Essaie d'exécuter pas-à-pas pour voir à quel niveau ça déconne

    Et fais voir ta traduction VB de l'algo

  18. #18
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Je mets le traduction VB en bas de message.

    Les RIB testés sont ceux de ma boite et un des ASSEDIC, je pense qu'ils doivent être bons.

    Pour le mode pas à pas, je peux pas. Je travail sur une serveur et le mode Pas à Pas ne fonctionne pas, on pas trouvé le moyen de faire en sorte que ça marche bien.

    Voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    	Private Shared regex_rib As Regex
     
    	''' <summary> 
    	''' Vérifie la validité d'un RIB 
    	''' </summary> 
    	''' <param name="rib">Le RIB à vérifier</param> 
    	''' <returns>true si le RIB est valide, false sinon</returns> 
    	Public Shared Function IsValidRib(ByVal rib As String) As Boolean
    		' Suppression des espaces et tirets 
    		Dim tmp As String = rib.Replace(" ", "").Replace("-", "")
     
    		' Vérification du format BBBBBGGGGGCCCCCCCCCCCKK 
    		' B : banque 
    		' G : guichet 
    		' C : numéro de compte 
    		' K : clé RIB 
    		If regex_rib Is Nothing Then
    			regex_rib = New Regex("(?<B>\d{5})(?<G>\d{5})(?<C>\w{11})(?<K>\d{2})", RegexOptions.Compiled)
    		End If
    		Dim m As Match = regex_rib.Match(tmp)
    		If Not m.Success Then
    			Return False
    		End If
     
    		' Extraction des composants 
    		Dim b_s As String = m.Groups("B").Value
    		Dim g_s As String = m.Groups("G").Value
    		Dim c_s As String = m.Groups("C").Value
    		Dim k_s As String = m.Groups("K").Value
     
    		' Remplacement des lettres par des chiffres dans le numéro de compte 
    		Dim sb As New StringBuilder()
    		For Each ch As Char In c_s.ToUpper()
    			If Char.IsDigit(ch) Then
    				sb.Append(ch)
    			Else
    				sb.Append(RibLetterToDigit(ch))
    			End If
    		Next
    		c_s = sb.ToString()
     
    		' Séparation du numéro de compte pour tenir sur 32bits 
    		Dim d_s As String = c_s.Substring(0, 6)
    		c_s = c_s.Substring(6, 5)
     
    		' Calcul de la clé RIB 
    		' Algo ici : http://fr.wikipedia.org/wiki/Clé_RIB#Algorithme_de_calcul_qui_fonctionne_avec_des_entiers_32_bits 
     
    		Dim b As Integer = Integer.Parse(b_s)
    		Dim g As Integer = Integer.Parse(g_s)
    		Dim d As Integer = Integer.Parse(d_s)
    		Dim c As Integer = Integer.Parse(c_s)
    		Dim k As Integer = Integer.Parse(k_s)
     
    		Dim calculatedKey As Integer = 97 - ((89 * b + 15 * g + 76 * d + 3 * c) Mod 97)
     
    		Return (k = calculatedKey)
    	End Function
     
    	''' <summary> 
    	''' Convertit une lettre d'un RIB en un chiffre selon la table suivante : 
    	''' 1 2 3 4 5 6 7 8 9 
    	''' A B C D E F G H I 
    	''' J K L M N O P Q R 
    	''' _ S T U V W X Y Z 
    	''' </summary> 
    	''' <param name="letter">La lettre à convertir</param> 
    	''' <returns>Le chiffre de remplacement</returns> 
    	Public Shared Function RibLetterToDigit(ByVal letter As Char) As Char
    		If letter >= "A"c AndAlso letter <= "I"c Then
    			Return CChar(ChrW((AscW(letter) - AscW("A"c) + AscW("1"c))))
    		ElseIf letter >= "J"c AndAlso letter <= "R"c Then
    			Return CChar(ChrW((AscW(letter) - AscW("J"c) + AscW("1"c))))
    		ElseIf letter >= "S"c AndAlso letter <= "Z"c Then
    			Return CChar(ChrW((AscW(letter) - AscW("S"c) + AscW("1"c))))
    		Else
    			Throw New ArgumentOutOfRangeException("Le caractère à convertir doit être une lettre majuscule dans la plage A-Z")
    		End If
    	End Function
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  19. #19
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Bon, je veins de refaire tous les test en maintenant ça marche trés bien.

    Je n'ai pas d'explication logique, sauf une recompilation du projet.
    C'est la seule chose qui c'est passsée dans mon code.

    Bref, ça marche alors je boucle.

    Encore une grand merci

    Mon nouvel ami, c'est plus GOOGLE, c'est tomlev

    Kenavo

    PS : tomlev, tu ferais pas dans la 3D par hasard ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    PS : tomlev, tu ferais pas dans la 3D par hasard ?
    non, j'y connais rien du tout...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Algorithme clé RIB & IBAN
    Par ApprentiDeveloppeur dans le forum C++
    Réponses: 1
    Dernier message: 17/01/2009, 13h29
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo