open sourceTech notes

Calcolo del codice di controllo CIN in IBAN Python

python programming programmazione da zero python

Il Calcolo

Ho trovato questo link molto interessate con il dettaglio della composizione dei codici IBAN.

In particolare è interessante il meccanismo di calcolo del codice di controllo CIN che riporto qui:

Nel corso del calcolo si usano le due seguenti successioni numeriche:

Successione per le posizioni dispari: 1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26
Successione per le posizioni pari: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28

Si parte dalla stringa di 22 caratteri ottenuta accostando ABI, CAB e conto corrente:

Scorrendo questa stringa da sinistra a destra, ogni carattere occupa in essa una posizione che è considerata dispari (caratteri primo, terzo, quinto, eccetera) oppure pari (caratteri secondo, quarto, sesto, eccetera). A ciascun carattere si attribuisce un peso, ricavato dall’una o dall’altra successione in base al criterio di parità, e tutti questi pesi vengono sommati.

Conviene chiarire il procedimento con un esempio.

Si prende il primo carattere, che di solito è numerico, ma in teoria potrebbe essere alfabetico. Se il carattere è 0 oppure A, gli si assegna come peso 1 (primo elemento della successione per le posizioni dispari), se è 1 oppure B gli si assegna il peso 0 (secondo elemento), se è 2 oppure C il peso 5 (terzo elemento) e così via.

Ciò fatto, si passa al secondo carattere della stringa e qui entra in gioco la successione per le posizioni pari. Quindi si assegna il peso 0 se il carattere è0 oppure A, il peso 1 se è 1 oppure B, il peso 2 se è 2 oppure C, eccetera.

Passando al terzo carattere si riprende la successione per le posizioni dispari e si procede fino a esaurire tutti i caratteri della stringa, alternando l’uso delle due successioni.

I pesi via via ottenuti vengono sommati e il risultato di questa somma viene diviso per 26, prendendo il resto di tale divisione.

In conclusione, il codice CIN è il carattere alfabetico che ha la posizione corrispondente a tale resto, cominciando a contare da 0, vale a dire A corrisponde a 0, B corrisponde a 1, C corrisponde a 2 e così via fino a Z che corrisponde a 25.

Calcolo del codice di controllo CIN in IBAN con Python

Ho fatto questa breve implementazione in Python che si può utilizzare in diverse modalità:

Questa, predefinita, prevede vengano passati da linea di comando, come argomenti, il codice Abi, Cab e il conto corrente.

# encoding: utf-8

import sys

def CalcolaCin(abi, cab, cc):
    checkiban = str(abi) + str(cab) + str(cc)

    alfa = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]

    posdis = [1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26]
    pospar = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]

    ri = 0
    cr = 0
    cs = 0
    resto = 0
    i = 0

    for p in checkiban:
        i = i +1
        if p.isdigit(): #se numerico
            if i % 2 == 1: # dispari
                #print "-->POSIZIONE PARI: %s VAL:%s" % (i,str(p))
                cs = cs + posdis[int(p)]
                #print "RISULTATO:%s\n" % (str(posdis[int(p)]))

            if i % 2 == 0: # pari
                #print "-->POSIZIONE DISPARI: %s VAL:%s" % (i,str(p))
                cs = cs + pospar[int(p)]
                #print "RISULTATO:%s\n" %(str(pospar[int(p)]))
        else: # se alfanumerico
            if i % 2 == 1: # dispari
                #print "-->POSIZIONE PARI: %s VAL:%s" % (i,str(p))
                cs =  cs + posdis[int(alfa.index(p))]
                #print "RISULTATO:%s\n" % (str(posdis[int(p)]))

            if i % 2 == 0: # pari
                #print "-->POSIZIONE DISPARI: %s VAL:%s" % (i,str(p))
                cs =  cs + pospar[int(alfa.index(p))]

    #print "CHECKSUM: %s" % cs
    ri = cs /26
    #print "RISULTATO INTERO: %s" % ri

    cr = 26 * ri
    resto = cs - cr
    #print "RESTO: %s" % resto

    print "IL TUO CODICE CIN: %s" % alfa[resto]

#abi = raw_input("Inserire il codice ABI:")
#cab = raw_input("Inserire il codice CAB:")
#cc = raw_input("Inserire il numero di conto corrente:")

#CalcolaCin(abi,cab,cc)
CalcolaCin(sys.argv[1],sys.argv[2],sys.argv[3])

Ho commentato le parti di debug, che possono essere utili per la verifica della procedura, e la parte di input diretto che può essere usata per richiedere un input esplicito all’utente, in questo caso si possono modificare le ultime righe in questo modo:

abi = raw_input("Inserire il codice ABI:")
cab = raw_input("Inserire il codice CAB:")
cc = raw_input("Inserire il numero di conto corrente:")

CalcolaCin(abi,cab,cc)
#CalcolaCin(sys.argv[1],sys.argv[2],sys.argv[3])

Comment here