Número de Identificação Bancária

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

Formato NIB editar

O NIB era 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.[1]

Formato editar

BBBB AAAA CCCC CCCC CCC KK

Onde:

Alguns códigos de bancos usados no NIB[2][3]

Verificação do NIB editar

Algoritmo editar

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 as por letras por números.

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 substituí-lo pelo número resultante:

 

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.

 

Algoritmo de verificação em C# editar

public bool NibIsValid(string nib)
{
    Regex nibRegex = new Regex(@"^\d{21}$", RegexOptions.Compiled);
    long result = 0;

    for (int nibIndex = 0; nibIndex < 19; nibIndex++)
    {
        int digit = Convert.ToInt32(nib[nibIndex].ToString(CultureInfo.InvariantCulture));
        result = (result + digit) * 10 % 97;
    }
    
    result = 98 - ((result * 10) % 97);
    return nib.Substring(19).Equals(result.ToString("00"));
}

Algoritmo de verificação em PHP editar

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

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

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

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[ligação inativa] 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

  #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

O IBAN, é um número utilizado para qual transação, tanto entre bancos de Portugal como com o estrangeiro. É composto pelo antigo Número de Identificação Bancária, pelo código do país e por dois dígitos que servem de controlo.[4] O IBAN deve ser sempre apresentado para leitura em maiúsculas e em grupos de quatro dígitos separados por espaço.[5]

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

Referências

  1. «O que é o NIB e o IBAN?». Millennium BCP. Consultado em 13 de Setembro de 2014. Cópia arquivada em 11 de Setembro de 2014 
  2. «XI. TABELA DE BANCOS» (PDF). Banco de Portugal. 2001. Consultado em 13 de Setembro de 2014. Arquivado do original (PDF) em 13 de novembro de 2014 
  3. Anexo à Instrução nº 1/96
  4. «Instrumentos de Pagamento - IBAN». Banco de Portugal. Consultado em 13 de Setembro de 2014. Cópia arquivada em 12 de Setembro de 2014 
  5. «CIRCULAR Nº 3.625» (PDF). Banco Central do Brasil. 14 de Fevereiro de 2013. Consultado em 13 de Setembro de 2014 

Ligações externas editar

Bibliografia editar

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