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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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 : 54
    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
    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.

  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 : 43
    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
    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 expérimenté
    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 : 54
    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
    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 ?

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 37
    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
    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 : 43
    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
    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

  6. #6
    Membre expérimenté
    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 : 54
    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
    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 ?

  7. #7
    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 : 43
    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
    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)))

  8. #8
    Membre expérimenté
    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 : 54
    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
    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 ?

  9. #9
    Membre expérimenté
    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 : 54
    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
    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.

+ Répondre à la discussion
Cette discussion est résolue.

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