Número de Identificação Bancária

Fonte: testwiki
Revisão em 16h29min de 4 de março de 2025 por imported>Tuvalkin (Desfeita a edição 69656165 de Cosmo Skerry: a fonte citada NÃO é a própria wikipédia)
(dif) ← Revisão anterior | Revisão atual (dif) | Revisão seguinte → (dif)
Saltar para a navegação Saltar para a pesquisa

Predefinição:Mais notas 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:

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

Verificação do NIB

Algoritmo

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:

currentCharValue+2currentCharValue109(mod10)

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+key0(mod97)

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 BigIntPredefinição: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

  #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

Predefinição:Referências

Ligações externas

Bibliografia

Predefinição:Esboço-banco