Il CIN in python

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,26Successione 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])

You must be logged in to post a comment.