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

C# Discussion :

Calcule Rib en C#


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut Calcule Rib en C#
    Bonjour je veux réaliser une fonction qui retourne le clé RIB voila ce que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void CalculeCleRib(string codeBanque, string codeGuichet, string numCompte)
            {
                codeBanque.ToUpper().Replace("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "12345678912345678923456789");
                Int64 cleRIB = 97 - ((89 * int.Parse(codeBanque) + 15 * int.Parse(codeAgence) + 3 * long.Parse(numeroCompte)) % 97);
            }
    Mais ça ne donne pas un le bon résultat. J'ai trouvé ce formule sur Wiki.
    Si quelqu'un a déjà travaillé sur ce problème merci de m'aider.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Il y a déjà eu une solution postée à ce sujet, sur ce forum. Tu pourras la trouver en suivant ce lien : http://www.developpez.net/forums/d56...ithme-cle-rib/

    [EDIT]OUPS, j'ai posté trop vite .. Ca ne permet pas de calculer la clé rib, mais suite à la réponse de Bluedeep ci-après, tu peux utiliser la méthode RibLetterToDigit (voir le premier post de Tomlev sur le lien) afin de remplacer les lettres par les bonnes valeurs.

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Citation Envoyé par khadime27 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                codeBanque.ToUpper().Replace("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "12345678912345678923456789");
    Cette ligne a la base est fausse : elle n'opére que sur un code banque qui contient la chaine "ABCDEFGHIJKLMNOPQRSTUVWXYZ", ce qui est très très improbable.

    Il faut faire faire un remplacement de A par 1, B par 2, etc .... voir la doc de la méthode Replace dont le fonctionnement n'a visiblement pas été compris; c'est là : http://msdn.microsoft.com/en-us/libr...(v=vs.90).aspx

  4. #4
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    Quoi qu'il en soit l'utilisation des Regex serait de toute facon plus appropries, je ne serait pas etonne qu'un regex existe deja.

  5. #5
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    RibLetterToDigit (voir le premier post de Tomlev sur le lien) afin de remplacer les lettres par les bonnes valeurs.[/QUOTE]
    J'ai suivi ton conseil et c'est bon pour le remplacement mais par contre c'est la formule que je comprend pas.
    Merci a tous pour avoir réagit aussi vite. Mais comme suis pas fort j'attend toujours votre aide.

  6. #6
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Ban en faite j'ai une solution qui marche en PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function calculerCleRib($sNumeroCompte)  
    {   
     
        $sNumeroCompte = strtr(strtoupper($sNumeroCompte), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','12345678912345678923456789');
        //le rib saisi
        $ribCompte = substr($sNumeroCompte, -2);   
        //recuperation du numéro de compte
        $NumeroCompte22 = substr($sNumeroCompte, 0, -2);
        $CleRib = bcsub('97', bcmod(bcmul($NumeroCompte22 , 100), '97'));
        $CleRib = str_repeat("0",max(0,2-strlen($CleRib))).$CleRib;
     
        return $CleRib ;
      }
    En conversant en C# ça donne un truc du genre

    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
     
     public static double GetCleRib(string chaine)
            {
                long cle = 0;
     
     
                // Remplacement des lettres par des chiffres dans le numéro de compte
                StringBuilder sb = new StringBuilder();
                foreach (char ch in chaine.ToUpper())
                {
                    if (char.IsDigit(ch))
                        sb.Append(ch);
                    else
                        sb.Append(RibLetterToDigit(ch));
                }
                chaine = sb.ToString();
                string cleRib = chaine.Substring(chaine.Length-2, 2);
                string numcompte = chaine.Substring(0, chaine.Length - 2);
                long numCompte = long.Parse(numcompte);
                cle = 97 - (97 % (numCompte * 100));
     
                return cle;
            }
    mais le problème c'est que les entier de type long ne peuvent pas contenir des nombre de 22 chiffres.
    Que me conseil vous?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    si je puis me permettre, voici une classe RIB qui peut t'aider...
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
     
    namespace GestionLMB.Model
    {
        public class Rib
        {
            public int codeBanque { get; set; }
            public int codeGuichet { get; set; }
            public string numCompte { get; set; }
            public int clefRib { get; set; }
            public string banque { get; set; }
     
            /// <summary>
            /// Instancie un Rib, qui sera rattaché à un client ou à un Site.
            /// </summary>        
            /// <param name="codeBanque">int</param>
            /// <param name="codeGuichet">int</param>
            /// <param name="numCompte">string</param>
            /// <param name="cleRib">int</param>
            /// <param name="banque">string</param>
            public Rib(int codeBanque, int codeGuichet, string numCompte, int clefRib, string banque)
            {            
                this.codeBanque = codeBanque;
                this.codeGuichet = codeGuichet;
                this.numCompte = numCompte;
                this.clefRib = clefRib;
                this.banque = banque;
            }
     
            /// <summary>
            /// Vérifie la validité d'un RIB
            /// </summary>
            /// <param name="rib">Rib</param>
            /// <returns>bool</returns>
            public bool IsValidRib()
            {            
                return (this.clefRib == this.getClefRib());
            }
     
            public int getClefRib()
            {
                string numCompte = null;
     
                // Remplacement des lettres par des chiffres dans le numéro de compte
                StringBuilder sb = new StringBuilder();
                foreach (char ch in this.numCompte.ToUpper())
                {
                    if (char.IsDigit(ch))
                        sb.Append(ch);
                    else
                        sb.Append(RibLetterToDigit(ch));
                }
                numCompte = sb.ToString();
     
                // Séparation du numéro de compte pour tenir sur 32bits
                string numCompte_deb = numCompte.Substring(0, 6);
                string numCompte_fin = numCompte.Substring(6, 5);
     
                // Calcul de la clé RIB
                int d = int.Parse(numCompte_deb);
                int c = int.Parse(numCompte_fin);
     
                int calculatedKey = 97 - ((89 * this.codeBanque + 15 * this.codeGuichet + 76 * d + 3 * c) % 97);
     
                return 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>
            private 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");
            }
        }
    }

  8. #8
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Merci d'avoir réagit aussi vite!
    Mais j'ai constaté que votre numero de compte est sur 11 position:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string numCompte_deb = numCompte.Substring(0, 6);
                string numCompte_fin = numCompte.Substring(6, 5);
    Alors que le mien fait 12 chiffres, c'est pourquoi le calcule n'est pas correcte.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    ne s'agirait-il pas plutôt d'un IBAN dont vous voulez calculer la clef ? Dans ce cas, effectivement le numéro est sur 12 positions.
    Un IBAN et un RIB ne sont pas composés de la même manière.
    Si cela vous intéresse, je peux également vous fournir la classe que j'utilise pour l'IBAN.

  10. #10
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par HammR Voir le message
    ne s'agirait-il pas plutôt d'un IBAN dont vous voulez calculer la clef ? Dans ce cas, effectivement le numéro est sur 12 positions.
    C'est bien la clé Rib qui est composé de code banque sur 5 positions, code guichet 5 positions et numéro de compte sur 12 positions.
    Effectivement toutes les solutions qui j'ai trouvé sur la toile propose des algo dont le numéro de compte est sur 11 positions

  11. #11
    Nouveau membre du Club
    Informaticien
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations professionnelles :
    Activité : Informaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Voila la solution

    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
     
     /// <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");
            }
     
    		 public static int RetourneRib(string codeBanque, string codeGuichet, string numCompte)
            {
                int cle = 0;
                string chaine = codeBanque + codeGuichet + numCompte;
                // Remplacement des lettres par des chiffres dans le numéro de compte
                StringBuilder sb = new StringBuilder();
                foreach (char ch in chaine.ToUpper())
                {
                    if (char.IsDigit(ch))
                        sb.Append(ch);
                    else
                        sb.Append(RibLetterToDigit(ch));
                }
                chaine = sb.ToString();
                decimal Compte = decimal.Parse(chaine);
                Compte = 97 - ((Compte * 100) % 97);
                cle = (int) Compte;
                return cle;
            }

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

Discussions similaires

  1. Calcul clé rib
    Par Maxence HUBICHE dans le forum Contribuez
    Réponses: 1
    Dernier message: 06/10/2016, 06h47
  2. [LibreOffice][Tableur] Calcul clef RIB et IBAN
    Par vandman dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 24/03/2015, 15h54
  3. [VB]Calcul Clé RIB
    Par dai.kaioh dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 18/01/2005, 11h09
  4. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

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