Número de Identificação Bancária

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

O Número de Identificação Bancária (NIB) é um elemento de informação normalizado, utilizado na identificação de contas bancárias domiciliadas em Portugal e que permite uma maior segurança e rapidez no encaminhamento na transferência a crédito de fundos.

Formato NIB[editar | editar código-fonte]

O NIB é composto por 21 algarismos, sendo os 4 primeiros o código do banco no qual a conta está domiciliada, seguidos do código do balcão ou agência (4 algarismos, que poderão ser zeros se o banco não utilizar esta referência), do número de conta (11 algarismos) e de dois algarismos de controlo.

Formato[editar | editar código-fonte]

BBBB AAAA CCCC CCCC CCC KK

Onde:

Alguns códigos de bancos usados no NIB[1]

Verificação do NIB[editar | editar código-fonte]

Algoritmo[editar | editar código-fonte]

Tabela de transformação de caracteres
Caracter Número correspondente
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

A validade de um NIB pode ser calculada através do seu algarismo de controlo.

A primeira etapa consiste em substituir os algarismos por letras.

Para realizar a transformação, basta colocar em base 36 (base 10 + 26 letras) e aplicar o cálculo seguinte a cada caracter (transformado em número currentCharValue) e depois substitui-lo pelo número resultante:


currentCharValue + 2^{\frac{currentCharValue-10}9}\pmod{10}

A etapa seguinte (facultativa) consiste em decompor o código e multiplicar cada parte por uma constante e somar. Finalmente, o código está correcto se o número obtido (quer pela concatenação, quer pela decomposição) corresponde a 0 módulo 97.


bankCode * 89 + counter * 15 + account * 3 + key \equiv 0 \pmod{97}

Algoritmo de verificação em C#[editar | editar código-fonte]

        public bool NibIsValid(string nib)
        {
            Regex nibRegex = new Regex(@"^\d{21}$", RegexOptions.Compiled);
            if (String.IsNullOrEmpty(nib) || !nibRegex.IsMatch(nib))
                return false;
            var result = 0;
            for (int nibIndex = 0; nibIndex < 19; nibIndex++)
            {
                result += Convert.ToInt32(nib[nibIndex].ToString(CultureInfo.InvariantCulture));
                result *= 10;
                result %= 97;
            }
            result = 98 - ((result * 10) % 97);
            return nib.Substring(19).Equals(result.ToString("00"));
        }

Algoritmo de verificação em PHP[editar | editar código-fonte]

A função check_rib devolve verdade ou falso conforme o número seja ou não válido.

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;
            $tabcompte .= $b;
        }
        else {
            $tabcompte .= $car;
        }
    }
    $int = $cbanque . $cguichet . $tabcompte . $clerib;
    return (strlen($int) >= 21 && bcmod($int, 97) == 0);
}

Algoritmo de verificação em Java[editar | editar código-fonte]

import java.math.BigDecimal;
 
public class Validation{
    public boolean checkRib(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);
        }
 
        return new BigDecimal(extendedRib.toString()).remainder(new BigDecimal(97)).intValue() == 0;
    }
}

Algoritmo de validação do check digit em Java[editar | editar código-fonte]

O anterior parecia não funcionar, recebe um nib, e valida o check digit desse nib

    public static boolean isValidNIB(String nib) {
        char[] toValidate = nib.substring(0, 19).toCharArray();
        Integer checkDigit = Integer.valueOf(nib.substring(19));
        Integer[] wi = { 73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3 };
        Integer sum = 0;
        for (int i = 0; i < 19; i++) {
            sum += Character.digit(toValidate[i], 10) * wi[i];
        }
        return checkDigit.equals(98 - (sum % 97));
    }

Algoritmo em JavaScript para através do número de conta obter o NIB[editar | editar código-fonte]

Este algoritmo serve para obter através do número de conta, o NIB. Faz uso das considerações técnicas acima referidas, mais precisamente o algoritmo para o cálculo dos dois algarismos de controlo. Este algoritmo faz ainda uso da classe BigInt para JavaScript, pois sendo o NIB um número com 21 algarismos não permite que a classe convencional de inteiros em JavaScript lide com o NIB. No algoritmo abaixo indicado toma-se como exemplo o caso em que o banco é a CGD (código 0035).

if (banco == "CGD"){
 
	banco_num=str2bigInt('0035',10,6,21);
	NIB_aux=mult(banco_num,str2bigInt('100000000000000000',10,6,21));
 
	str_conta_banco = document.conta_banco.conta.value; //número de conta
 
	if(isNaN(str_conta_banco) || str_conta_banco.length!=13){ //validação do número de conta CGD
		alert("Número de conta CGD inválido");
		return;
	}
 
	var conta_num = str2bigInt(str_conta_banco,10,6,21); //conversão da string em BigInt
 
	var conta_sem_balcao = mod(conta_num,str2bigInt('1000000000',10,6,21)); //número de conta(sem o número do balcão)
	var balcao = sub(conta_num,conta_sem_balcao);//código do balcão com 9 zeros
 
	conta_sem_balcao = mult(conta_sem_balcao,str2bigInt('100',10,6,21));//código do balcão para adicionar ao NIB
 
	balcao = mult(balcao,str2bigInt('10000',10,6,21));//código do balcão com 13 zeros (correcto)
 
	NIB_aux=add(NIB_aux,add(balcao,conta_sem_balcao));//cód. banco + cód. balcão + conta_sem_balcão
 
	NIB_ref=sub(str2bigInt('98',10,6,21),mod(NIB_aux,str2bigInt('97',10,6,21))); //faz 98-(NIB(com os algarismos de controlo a 00) módulo 97) para obter os algarismos de controlo
 
	NIB=add(NIB_aux,NIB_ref); //soma os algarismos de controlo ao NIB calculado 
	NIB_str="00"+bigInt2str(NIB,10);// soma dois zeros à string pois o código da CGD é apenas 35
 
	document.write("<center>O seu NIB &eacute;: "+NIB_str+"<br></br></center>");//imprime o NIB
 
	return;
}

Validação em RUBY[editar | editar código-fonte]

  #Validates a NIB (Número de Identificação Bancaria)
  def validate_nib(nib)
 
 
    #puts nib
    toValidate = nib.slice(0..18)
    #puts toValidate
    checkDigit = nib.slice(19..20).to_i
    #puts checkDigit.to_s
    wi = [73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3]
    sum = 0
    (0..18).each do |i|
      digit = nib.slice(i).to_i
      sum = sum + digit * wi[i];
 
    end
    partial = sum % 97
    controlCheckDigit = 98 - partial;
    return checkDigit == controlCheckDigit
 
  end

IBAN[editar | editar código-fonte]

Para converter um NIB em IBAN basta acrescentar "PT50" antes do NIB. Exemplo: PT50 BBBB AAAA CCCC CCCC CCCK K

Referências

  1. Anexo à Instrução nº 1/96

Ligações externas[editar | editar código-fonte]

Aplicação online para obter o NIB através do número da conta

Bibliografia[editar | editar código-fonte]

Ícone de esboço Este artigo sobre um banco ou instituição financeira é um esboço. Você pode ajudar a Wikipédia expandindo-o.