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
editarO 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
editarBBBB 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);
|
|
Verificação do NIB
editarAlgoritmo
editarCaracter | 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#
editarpublic 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
editarA 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
editarimport 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
editarO 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
editarEste 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
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
editarO 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