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
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
BBBB AAAA CCCC CCCC CCC KK
Onde:
- B = 1-4 código do banco;
- A = 5-8 código do balcão ou agência (zeros se o banco não utilizar esta referência);
- C = número da conta (9-19);
- K = 2 algarismos de controlo (20-21);
- Alguns códigos de bancos usados no NIB[2][3]
|
|
Verificação do NIB
Algoritmo
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#
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
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
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
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
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 é: "+NIB_str+"<br><br></center>");//imprime o NIB return; }
Validação em RUBY
#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
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
- ↑ «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
- ↑ «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
- ↑ Anexo à Instrução nº 1/96
- ↑ «Instrumentos de Pagamento - IBAN». Banco de Portugal. Consultado em 13 de Setembro de 2014. Cópia arquivada em 12 de Setembro de 2014
- ↑ «CIRCULAR Nº 3.625» (PDF). Banco Central do Brasil. 14 de Fevereiro de 2013. Consultado em 13 de Setembro de 2014
Ligações externas
- Aplicação online para obter o NIB através do número da conta
- Verificação de IBAN para a valida
- Folha para Cálculo do NIB
Bibliografia
- «Banco de Portugal — Transferências a Crédito: Sistemas de Pagamento. Cadernos do Banco de Portugal. Lisboa (2002), n.º 2» (PDF)
Este artigo sobre um banco ou instituição financeira é um esboço. Você pode ajudar a Wikipédia expandindo-o.
|