AccueilđŸ‡«đŸ‡·Chercher

Basic Bank Account Number

Le Basic Bank Account Number (BBAN, litt. « numéro de compte bancaire basique ») ou relevé d'identité bancaire (RIB), en France, ou encore spécimen de chÚque (Québec) est une suite de chiffres délivré par la banque et qui indique de maniÚre unique un compte bancaire au niveau national. Il est remis à un débiteur ou un créancier dans le but d'opérer des virements bancaires ou des prélÚvements bancaires à partir de ce compte. Ces éléments sont souvent présents sur les chÚques (chéquier).

Remplacement du RIB par l'IBAN

En France

La notion de RIB a été officiellement abolie avec le passage au format SEPA[1]. Néanmoins ce terme est encore largement utilisée pour désigner l'IBAN (International Bank Account Number) qui permet d'identifier un compte à l'international. Aujourd'hui les comptes bancaires français disposent du relevé d'identité bancaire qui comporte : l'IBAN, le RIB et le BIC. En Europe, l'IBAN est suffisant pour opérer des opérations bancaires SEPA (prélÚvement et virement)[2].

En France, l'IBAN est inscrit sur le relevé de compte du compte en question[3].

LĂ©gislation

La rĂ©glementation SEPA entraĂźne l'impossibilitĂ© d'utiliser le RIB pour des opĂ©rations bancaires, l'IBAN Ă©tant nĂ©cessaire et suffisant. Les virements et prĂ©lĂšvements nationaux et europĂ©ens sont soumis aux mĂȘmes frais et aux mĂȘmes droits et devoirs. Il est Ă©galement possible d'utiliser l'IBAN d'un autre pays europĂ©en dans son propre pays.

Les établissements de crédit (BNP Paribas, Société générale, Crédit agricole
), les établissements de paiement (Nickel par exemple) ainsi que les établissements de monnaie électronique (Paypal, Treezor
) ont la faculté de délivrer des IBAN.

Composition

Composition du BBAN
3 Ă  12 positions 8 Ă  20 positions
IID BAN
  • IID : identification de l’établissement financier
  • BAN : numĂ©ro de compte bancaire

Il n'a pas plus de 30 positions. Chaque pays a la responsabilité de définir le format de son BBAN.

Exemples

  • France et Monaco (23 caractĂšres) Format : BBBBBGGGGGCCCCCCCCCCCKK
B = code banque (5 chiffres), G = code guichet (5 chiffres), C = numéro de compte (11 chiffres et/ou lettres), K = clé RIB (2 chiffres entre 01 et 97)
  • Belgique (12 chiffres) Format : BBBCCCCCCCKK
B = code banque (3 chiffres), C = numéro de compte (7 chiffres), KK = BBBCCCCCCC modulo 97 (si égal à 0, KK = 97)
  • Allemagne (18 chiffres) Format BBBBBBBBCCCCCCCCCC
B = code banque (8 chiffres), C = numéro de compte (10 chiffres. Si moins, compléter à gauche avec des 0)
Nota: le numéro de compte allemand (C) contient une clé de contrÎle, mais sa position et son calcul diffÚrent d'une banque à l'autre. Il existe plus de 100 méthodes différentes de calcul de la clé en Allemagne (source : de:Kontonummer)

Clé RIB

ClĂ© = 97 − ([concatĂ©nation de banque, guichet, compte] * 100 modulo 97). Cette clĂ© est proche de celle du numĂ©ro de SĂ©curitĂ© sociale français, Ă  la diffĂ©rence qu'il n'est pas centuplĂ©. Si le compte comporte des lettres (banques françaises Banque postale et CrĂ©dit lyonnais), remplacer la lettre par son index de 1 Ă  9 dans l'alphabet (etc.) en laissant un saut entre R et S ().

Calcul de la Clef RIB en Java

	public int getRibKey(String rib) {
		 
		StringBuilder extendedRib = new StringBuilder(rib.length());
		for (char currentChar : rib.toCharArray()) {
			//Works on base 36
			int currentCharValue = Character.digit(currentChar, Character.MAX_RADIX);
			//Convert character to simple digit
			extendedRib.append(currentCharValue<10?currentCharValue:(currentCharValue + (int) StrictMath.pow(2,(currentCharValue-10)/9))%10);
		}
		
		BigDecimal extendedRibInt = new BigDecimal(extendedRib.toString());
		return 97- extendedRibInt.multiply(new BigDecimal(100)).toBigInteger().mod(new BigDecimal(97).toBigInteger()).intValue();
	}

Le chéquier

Le relevé d'identité bancaire, sur le carnet de chÚque, est composé de :

  • l'International Banking Account Number (IBAN), numĂ©ro de compte Ă  la norme internationale ISO n° 13616
  • le Bank Identification Code (BIC), identifiant de l'Ă©tablissement financier (la banque) Ă  la norme internationale ISO n° 9362
  • le nom et l'adresse du titulaire du compte, en date d'Ă©tablissement du carnet de chĂšque (les chĂšques restant valides aprĂšs dĂ©mĂ©nagement)
  • le nom de l'Ă©tablissement financier (la banque) et du guichet de domiciliation (l'agence bancaire)

VĂ©rification du RIB

Algorithme

La validité d'un RIB se calcule grùce à la clé de celui-ci.

La premiÚre étape consiste à remplacer les lettres présentes par des chiffres pour faciliter le calcul.

Tableau de transformation des caractĂšres
CaractÚre Chiffre représentant
0 0
1, A, J 1
2, B, K, S 2
3, C, L, T 3
4, D, M, U 4
5, E, N, V 5
6, F, O, W 6
7, G, P, X 7
8, H, Q, Y 8
9, I, R, Z 9

Pour faire la transformation, il suffit de se placer en base 36 (base 10 + 26 lettres) et d'appliquer le calcul suivant sur chaque caractÚre (transformé en nombre currentCharValue) puis de remplacer le sélectionné par le nombre donné :

L'étape suivante (facultative) consiste à décomposer le code et multiplier chaque partie par une constante et en faire la somme. Enfin, le code est correct si le nombre obtenu (soit par simple concaténation de nos différentes parties, soit par décomposition) est congru à 0 modulo 97.

VĂ©rification du RIB en C#

La fonction check_rib retourne vrai ou faux en fonction de la validité des informations.

VĂ©rification du RIB en Java

import java.math.BigDecimal;
public class Validation{
    public boolean checkRib(String rib) {
        StringBuilder extendedRib = new StringBuilder(rib.length());
        for (char currentChar : rib.toCharArray()) {
            int intValue;
            if ('0' <= currentChar && currentChar <= '9') {
                intValue = currentChar - '0';
            } else if ('A' <= currentChar && currentChar <= 'I') {
                intValue = currentChar - 'A' + 1;
            } else if ('J' <= currentChar && currentChar <= 'R') {
                intValue = currentChar - 'J' + 1;
            } else if ('S' <= currentChar && currentChar <= 'Z') {
                intValue = currentChar - 'S' + 2;
            } else {
                return false;
            }
            extendedRib.append(intValue);
        }
        return new BigDecimal(extendedRib.toString()).remainder(new BigDecimal(97)).intValue() == 0;
    }
}

VĂ©rification du RIB en Perl

Avec :

  • $cbanque : code de la banque
  • $cguichet : code du guichet
  • $nocompte : numĂ©ro de compte
  • $clerib : clĂ© rib
    use Math::BigInt;
    my %letter_substitution = ("A" => 1, "B" => 2, "C" => 3, "D" => 4, "E" => 5, "F" => 6, "G" => 7, "H" => 8, "I" => 9,
                               "J" => 1, "K" => 2, "L" => 3, "M" => 4, "N" => 5, "O" => 6, "P" => 7, "Q" => 8, "R" => 9,
                                         "S" => 2, "T" => 3, "U" => 4, "V" => 5, "W" => 6, "X" => 7, "Y" => 8, "Z" => 9); 
    my $tabcompte = ""; 
    my $len = length($nocompte);
    return 0 if ($len != 11);
    for (my $i = 0; $i < $len; $i++) {
        my $car = substr($nocompte, $i, 1); 
        if ($car !~ m/^\d$/) {
            my $b = $letter_substitution{uc($car)};
            my $c = ( $b + 2**(($b - 10)/9) ) % 10; 
            $tabcompte .= $c; 
        } else {
            $tabcompte .= $car;
        }   
    }   
    my $int = "$cbanque$cguichet$tabcompte$clerib";
    return (length($int) >= 21 && Math::BigInt->new($int)->bmod(97) == 0) ? 1 : 0;

VĂ©rification du RIB en PHP

La fonction check_rib retourne vrai ou faux en fonction de la validité des informations.

function check_rib($cbanque, $cguichet, $nocompte, $clerib) {
	$tabcompte = "";
	$len = strlen($nocompte);
	if ($len != 11) {
		return false;
	}
	for ($i = 0; $i < $len; $i++) {
		$car = substr($nocompte, $i, 1);
		if (!is_numeric($car)) {
			$c = ord($car) - (ord('A') - 1);
			$b = (($c + pow ( 2, ($c - 10) / 9 )) % 10) + (($c > 18 && $c < 25) ? 1 : 0);
			$tabcompte .= $b;
		}
		else {
			$tabcompte .= $car;
		}
	}
	$int = $cbanque . $cguichet . $tabcompte . $clerib;
	return (strlen($int) >= 21 && bcmod($int, 97) == 0);
}

VĂ©rification du RIB en Python

def check_rib(rib):
    if len(rib) != 23:
        return False
    _RIB_MAP = {
        'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5', 'F':'6', 'G':'7', 'H':'8', 'I':'9',
        'J':'1', 'K':'2', 'L':'3', 'M':'4', 'N':'5', 'O':'6', 'P':'7', 'Q':'8', 'R':'9',
        'S':'2', 'T':'3', 'U':'4', 'V':'5', 'W':'6', 'X':'7', 'Y':'8', 'Z':'9',
    }
    values = "".join(_RIB_MAP.get(char.upper(), char) for char in rib)
    if not values.isdigit():
        return False
    bankcode = int(values[:5])
    counter = int(values[5:10])
    account = int(values[10:21])
    key = int(values[21:])
    return (bankcode*89 + counter*15 + account*3 + key) % 97 == 0

VĂ©rification du RIB en Ruby

Avec :

  • rib : le RIB complet sans espace Ă  passer Ă  la mĂ©thode.
  def rib?(rib)
    bank, office, account, key = rib.match(/^(\d{5})(\d{5})([[:alnum:]]{11})(\d{2})$/).captures
    account                    = account.each_char.inject('') do |sum, char|
      char = char.to_i 36
      sum  += ((char + 2 ** ((char - 10)/9)).to_i % 10).to_s
    end
    result                     = bank + office + account + key
    result.size >= 21 && result.to_i % 97 == 0
  rescue
    # Le RIB n’est pas valide
    false
  end

VĂ©rification du RIB en SQL

Cette vĂ©rification permet de valider la saisie de l'utilisateur, qui renseigne Ă  l'exĂ©cution de la requĂȘte SQL les codes Banque, Guichet et numĂ©ro de compte, ou de lui demander une nouvelle saisie.

  select Saisie.*
         ,97-mod(Banque*89+Guichet*15+Compte*3,97) CleRIB
  from (select substr(lpad(&Banque,5,'0'),1,5) Banque
              ,substr(lpad(&Guichet,5,'0'),1,5) Guichet
              ,translate(upper(substr(lpad('&Compte',11,'0'),1,11))
                       ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                       , 12345678912345678923456789
               ) Compte
        from dual
       ) Saisie;

VĂ©rification du RIB en SQL pour Oracle

Cette vérification permet de vérifier un grand nombre de RIB, dans une table RIB_payment

CREATE TABLE ( rib_id    NUMBER(10)
    , rib_banque     VARCHAR2(12)
         CONSTRAINT rib_banque_nn_payment NOT NULL NOT NULL
    , rib_guichet      VARCHAR2(12) 
         CONSTRAINT rib_guichet_nn_payment NOT NULL
    , rib_compte          VARCHAR2(20) 
         CONSTRAINT rib_compte_nn_payment NOT NULL
    , rib_cle   VARCHAR2(3)
    , rib_saisie_date      DATE  DEFAULT SYSDATE 
         CONSTRAINT rib_saisie_date_nn_payment  NOT NULL
    , person_id         VARCHAR2(10)/*titulaire, personne morale ou physique*/
       CONSTRAINT     rib_person_id_nn_payment  NOT NULL
    , CONSTRAINT     rib_person_id_uk_payment
                     UNIQUE (person_id)
    )

saisie au préalable, et en relation avec une table des personnes (personnes physiques ou personnes morales).

 SELECT IBAN,
MOD(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE( REPLACE( substr(IBAN,5,length(IBAN))||substr(IBAN,1,4)
,'A','10'),'B','11'),'C','12'),'D','13'),'E','14')
,'F','15'),'G','16'),'H','17'),'I','18'),'J','19')
,'K','20'),'L','21'),'M','22'),'N','23'),'O','24')
,'P','25'),'Q','26'),'R','27'),'S','28'),'T','29')
,'U','30'),'V','31'),'W','32'),'X','33'),'Y','34')
,'Z','35')  ,' ','')
,97) IBAN_modulo
FROM  COMPTE

La requĂȘte contrĂŽle le IBAN (on peut facilement le construire Ă  partir du RIB).

VĂ©rification du RIB en VBA

Ce code fonctionne sous Excel, l'abréviation « VBE » étant la contraction de VBA pour Excel.

VĂ©rification du RIB en VB.NET

    Private Function textetochiffre(ByVal numero As String) As Integer
        If IsNumeric(numero) = False Then
            numero = Asc(numero) - 55
        End If
        Return Math.Floor((numero + Math.Pow(2, (numero - 10) / 9)) Mod 10)
    End Function
    Private Function verifierrib(ByVal plainrib As String)
        Dim rib As String = ""
        For i = 0 To plainrib.Count - 1
            rib = rib & textetochiffre(plainrib.Substring(i, 1))
        Next
        Dim banknote As String = rib.Substring(0, 5)
        Dim guichet As String = rib.Substring(5, 5)
        Dim compte As String = rib.Substring(10, 11)
        Dim clerib As String = rib.Substring(21, 2)
        Dim result As Integer = (banknote * 89 + guichet * 15 + compte * 3 + clerib) Mod 97
        If result = 0 Then
            Return True
        Else
            Return False
        End If
    End Function

Conversion du RIB en IBAN

Algorithme

  1. Créer un IBAN temporaire, composé du code du pays : FR pour la France, suivi de " 00 " et du " code RIB "
  2. DĂ©placer les 4 premiers caractĂšres de l’IBAN vers la droite du numĂ©ro.
  3. Convertir les lettres en chiffres, selon le principe "A" vaut "10" ... "Z" vaut "35".
  4. Calculer le modulo 97 et retrancher le reste de 98. Si le résultat comporte un seul chiffre, insérer un zéro devant.

InsĂ©rer le rĂ©sultat ainsi obtenu Ă  la position 3 de l’IBAN temporaire crĂ©Ă© dans l’étape 1.

Conversion du RIB en IBAN en C#

public static string GetIban(string codebanque, string codeGuichet, string numerocompte, string cle)
{
    const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var tmp = (codebanque + codeGuichet + numerocompte + cle + "FR00").ToUpper();
    foreach (var c in tmp.Where(char.IsLetter))
    {
        tmp = tmp.Replace(c.ToString(CultureInfo.InvariantCulture), (alphabet.IndexOf(c) + 10).ToString(CultureInfo.InvariantCulture));
    }
    var ibanKey = (98 - (System.Numerics.BigInteger.Parse(tmp) % 97)).ToString(CultureInfo.InvariantCulture);
    return "FR" + ((ibanKey.Length == 1) ? "0" : "") + ibanKey + codebanque + codeGuichet + numerocompte + cle;
}

Conversion du RIB en IBAN en Java

public static String getIBAN(String codebanque, String codeGuichet, String numerocompte, String cle) {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String tmp = codebanque + codeGuichet + numerocompte + cle + "FR00";
    tmp = tmp.toUpperCase();
    for (char c : tmp.toCharArray()) {
        if (Character.isLetter(c)) {
            tmp  = tmp .replaceAll(String.valueOf(c), String.valueOf(alphabet.indexOf(c) + 10));
        }
    }
    String ibanKey =
            String.valueOf(new BigDecimal(98).subtract(new BigDecimal(tmp).remainder((new BigDecimal(97)))));
    if (ibanKey.length() == 1) {
        ibanKey = "0" + ibanKey;
    }
    return "FR" + ibanKey + codebanque + codeGuichet + numerocompte + cle;
}

Conversion du RIB en IBAN en Perl

use bigint;
sub rib_to_iban {
	my ($rib) = @_;
	my @letter = ('0'..'9','A'..'Z');
	my $iban = "";
	foreach my $char(split(//,"${rib}FR00")) {
		my ($index) = grep { $letter[$_] eq $char } (0 .. @letter-1);
		$iban .= $index;
	}
	my $key = 98 -  ($iban % 97);
    return sprintf("FR%.2d%s" ,$key, $rib);
}

Conversion du RIB en IBAN en PHP

function Rib2Iban($codebanque,$codeguichet,$numerocompte,$cle){
	$charConversion = array("A" => "10","B" => "11","C" => "12","D" => "13","E" => "14","F" => "15","G" => "16","H" => "17",
	"I" => "18","J" => "19","K" => "20","L" => "21","M" => "22","N" => "23","O" => "24","P" => "25","Q" => "26",
	"R" => "27","S" => "28","T" => "29","U" => "30","V" => "31","W" => "32","X" => "33","Y" => "34","Z" => "35");
	$tmpiban = strtr(strtoupper($codebanque.$codeguichet.$numerocompte.$cle)."FR00",$charConversion);
	// Soustraction du modulo 97 de l'IBAN temporaire Ă  98
	$cleiban = strval(98 - intval(bcmod($tmpiban,"97")));
	if (strlen($cleiban) == 1)
		$cleiban = "0".$cleiban;
	return "FR".$cleiban.$codebanque.$codeguichet.$numerocompte.$cle;
}

Conversion du RIB en IBAN en Python

Avec :

  • rib : le RIB complet sans espace Ă  passer Ă  la mĂ©thode.
def rib_to_iban(rib):
    tmp_iban = int("".join(str(int(c,36)) for c in rib+"FR00"))
    key = 98 - (tmp_iban % 97)
    return "FR%.2d%s" % (key, rib)

Conversion du RIB en IBAN en Ruby

Avec :

  • rib : le RIB complet sans espace Ă  passer Ă  la mĂ©thode.
  def rib_to_iban(rib)
    tmp_iban = "#{rib}FR00".each_char.map { |char| char.to_i(36).to_s }.join.to_i
    key = 98 - (tmp_iban % 97)
    "FR%.2d%s" % [key, rib]
  end

Conversion du RIB en IBAN en SQL Server 2008 R2 (Microsoft)

-- Creates an IBAN (International Bank Account Number) from a BBAN (Basic Bank Account Number) and BIC (Bank Identifier Code)
-- SQL 2008 R2
-- Tested on several SEPA countries
CREATE FUNCTION [dbo].[SQL_F_BBAN_IBAN] (@bban varchar(30), @bic varchar(11))
RETURNS varchar(40)
AS
-- Creates an IBAN (International Bank Account Number) from a BBAN (Basic Bank Account Number) and BIC (Bank Identifier Code)
-- In :		BBAN, BIC
-- Returns :	IBAN
BEGIN 
	declare @bbanwk varchar(60), @country char(2), @bbannbp int, @bbanp varchar(9), @pos smallint, @mod int, @i smallint, @keyiban char(2), @iban varchar(40)
	-- Get the country code from the BIC
	set @country = substring(@bic, 5, 2)
	-- Place it at the end of BBAN
	set @bbanwk = @bban + @country + '00'
	-- Replace any letters with their numeric value (code ASCII - 55)
	while isnumeric(@bbanwk+'e0') = 0
		BEGIN
			set @pos = (select patindex('%[^0-9]%',@bbanwk))
			set @bbanwk = (select replace(@bbanwk,substring(@bbanwk,@pos,1),ascii(substring(@bbanwk,@pos,1))-55))
		END
	-- Split the BBAN into parts of 9 numbers max (because too long for SQL data type INT) and calculate MOD 97 of each part
	-- suppose to add 1 iteration each 4 iteration, so init @i = 0 and not 1 for some case.
	set @bbannbp = ceiling(len(@bbanwk) / 9.0) 
	set @pos = 10
	set @i = 0
	set @bbanp = left(@bbanwk, 9)
	while @i <= @bbannbp
		BEGIN
			set @mod = cast(@bbanp as int) % 97
			-- Put the result at the beginning of the next group			
			set @bbanp = cast(@mod as varchar) + substring(@bbanwk, @pos, 7)
			set @i = @i + 1
			set @pos = @pos + 7
		END
	-- IBAN key 2 characters
	set @keyiban = right('00' + cast((98 - @mod) as varchar), 2)
	set @iban = @country + @keyiban + @bban
RETURN @iban
END
GO

Conversion du RIB en IBAN en SQL pour Oracle

FUNCTION SO_F_RIB_IBAN(pi_va_rib IN VARCHAR2) RETURN VARCHAR2
IS
  l_i_loop INTEGER;
  l_va_return VARCHAR2(40);
  l_n_clee INTEGER;
BEGIN
  l_va_return := UPPER(pi_va_rib) || 'FR00';
		
  -- Transformation de A-Z en 10-35
  FOR l_i_loop IN 0 .. 25 LOOP
    l_va_return := REPLACE(l_va_return, CHR(65+l_i_loop), (10+l_i_loop));		
  END LOOP;
		
  -- Soustraction du modulo 97 de l'IBAN temporaire Ă  98
  l_n_clee := (98 - MOD(l_va_return,97));
 
  -- Retourne l'iban
  RETURN 'FR' || TRIM(TO_CHAR(l_n_clee, '00')) || UPPER(pi_va_rib);		
END SO_F_RIB_IBAN;

Conversion du RIB en IBAN en VBA

Ce code fonctionne sous Excel, l'abréviation « VBE » étant la contraction de VBA pour Excel.

Conversion du RIB en IBAN en VB.NET

Public Function GetIBAN(rib As String) As String
	rib = rib.Replace(" ", "")
	Dim tmpIBAN As New StringBuilder()
	For Each c As Char In (rib + "FR00").ToUpper()
		Dim v As Integer = Asc(c) + If(c >= "A"c, -Asc("A") + 10, -Asc("0"))
		tmpIBAN.Append(v)
	Next
	Dim tmpIBANString As String = tmpIBAN.ToString()
	Dim checksum As Integer = 0
	For Each c In tmpIBANString
		checksum *= 10
		checksum += Integer.Parse(c)
		checksum = checksum Mod 97
	Next
	Dim ibanKey As String = (98 - checksum).ToString()
	Return "FR" + Right("0" & ibanKey, 2) + rib
End Function

Conversion du RIB en IBAN en JavaScript

function GetIban(codeBanque, codeGuichet, numCompte, cleRib) {
        var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var tmp = "";
        tmp = "" + String(codeBanque) + String(codeGuichet) + String(numCompte) + String(cleRib) + "FR00";
        tmp = tmp.toUpperCase();
        tmp = tmp.split(""); 
        
        for (var i = 0; i < tmp.length; i++) {
            if (alphabet.indexOf(tmp[i]) != -1) {
                tmp[i] = String(alphabet.indexOf(tmp[i]) + 10);
            }
        }
        tmp = tmp.join("");
        var moduloRemainder = parseInt(tmp % 97, 10);
        var ibanKey = (98 - moduloRemainder).toString();
        if (ibanKey.length == 1) {
            ibanKey = "0" + ibanKey;
        }
        return "FR" + ibanKey + codeBanque + codeGuichet + numCompte + cleRib;
    };

Notes et références

Articles connexes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.