Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Allegato
Verifica della correttezza di un codice IBAN
Scritto da Enrico Oemi il 17-06-2010 ore 10:12
Intel System Studio
Il seguente algoritmo permette di verificare la correttezza di un codice IBAN, utilizzato per identificare univocamente un conto corrente bancario a livello mondiale, sia esso nazionale che estero. L'algoritmo è molto semplice e si basa sulle seguenti regole di convalida di un codice bancario IBAN:
  • l'IBAN deve essere una stringa costituita di 4 caratteri più il codice BBAN nazionale;
  • esso deve contenere solo lettere maiuscole dell'alfabeto da A a Z e cifre da 0 a 9. La funzione di verifica effettua una conversione in maiuscolo delle lettere, pertanto un codice scritto con lettere minuscole può comunque risultare corretto;
  • le posizioni 0 e 1 possono essere occupate esclusivamente da una sigla valida ISO del Paese, mentre le posizioni 2 e 3 da un numero;
  • i primi quattro caratteri della stringa originale vengono scambiati con il resto;
  • ogni carattere è convertito in un codice da 0 a 35 secondo la seguente regola: la cifra è trasformata nel numero corrispondente, ad esempio 7 in 7. In sostanza, la lettera A si converte in 10, B in 11, ecc., Z si converte in 35. Dai numeri così ottenuti viene composta una nuova stringa numerica. Quest'ultima viene interpretata ora come un numero, che diviso per 97, dovrebbe dare come resto 1. Per facilitare la divisione dei numeri eccessivamente lunghi, è possibile spezzare la stringa numerica in parti più piccole e calcolare il resto della divisione della prima parte per 97, poi comporre una nuova stringa numerica dal resto della divisione e dal secondo pezzo e dividere questo numero per 97, e così via.

Le funzioni sono state scritte in VBA e sono accompagnate dal codice di creazione della tabella contenente i codici ISO delle nazioni aggiornata al 2008. Le funzioni realizzate sono 2. La prima, EliminaSpazi, è necessaria a eliminare gli spazi eventualmente presenti all'interno della stringa da esaminare:
  1. Public Function eliminaSpazi(stringa As String) As String
  2.  Dim i As Integer
  3.  Dim pos As Variant
  4.  Dim lung As Integer
  5.  
  6.  lung = Len(stringa)
  7.  pos = InStr(1, stringa, " ", vbTextCompare)
  8.  If IsNumeric(pos) And pos <> 0 Then
  9.     stringa = Left(stringa, pos - 1) & eliminaSpazi(Right(stringa, lung - pos))
  10.  End If
  11.  eliminaSpazi = stringa
  12. End Function

La seconda funzione è la principale:
  1. Public Function CheckIBAN(IBAN As String) As Boolean
  2.  
  3.  ' Enrico Oemi 28/01/2009
  4.  
  5.  IBAN = eliminaSpazi(IBAN)
  6.  IBAN = UCase(IBAN)
  7.  
  8.  If Len(IBAN) < 5 Then
  9.     CheckIBAN = False
  10.     Exit Function
  11.  End If
  12.  
  13.  If DLookup("NAZIONE", "CODICI_ISO_NAZIONI", "CODICE = '" & Left(IBAN, 2) & "'") = "" Then
  14.     CheckIBAN = False
  15.     Exit Function
  16.  End If
  17.  
  18.  If Not IsNumeric(Mid(IBAN, 3, 2)) Then
  19.     CheckIBAN = False
  20.     Exit Function
  21.  End If
  22.  
  23.  IBAN = Mid(IBAN, 5) & Left(IBAN, 4)
  24.  
  25.  Dim i As Integer
  26.  Dim resto As Integer
  27.  
  28.  For i = 1 To Len(IBAN)
  29.     resto = CLng(resto & IIf(IsNumeric(Mid(IBAN, i, 1)), Mid(IBAN, i, 1), CStr(Asc(Mid(IBAN, i, 1)) - 55))) Mod 97
  30.  Next
  31.  
  32.  If resto <> 1 Then
  33.     CheckIBAN = False
  34.     Exit Function
  35.  End If
  36.  CheckIBAN = True
  37.  
  38.  End Function

Di seguito il codice SQL per la creazione della tabella con i codici ISO delle nazioni:
  1. CREATE TABLE CODICI_ISO_NAZIONI (Nazione TEXT (255), Codice TEXT (2) )
In allegato è disponibile l'elenco dei codici e nomi delle nazioni, che possono essere importate ad esempio in Access, nella tabella appena creata con un semplice copia/incolla.
Formato: PDF (Acrobat Portable Document Format)
Dimensione: 31.67 KB
Codice per il download:  
Tutti gli allegati vengono testati, pertanto se non riesci ad aprire un file PDF perché il tuo viewer dice che il file è corrotto, installa l'ultima versione di Adobe Reader, disponibile sia per Windows, che per Mac OS X e Linux/Unix. Nel caso il problema persista segnala l'errore alla redazione usando l'apposita icona (quella che raffigura uno scarafaggio) della toolbar qui sotto.
Precedente: La personalizzazione delle applicazioni: l'usabilità
Successiva: Guida alla programmazione in Perl: reference e strutture (3/4)
Intervento di Marco Zordan a.k.a. customsoft del 18-06-2010 ore 10:51, Arzignano (VI)
Cavaliere
Cavaliere

(108 interventi)
Iscritto il 14-02-2002
lol

Consiglio un'occhiatina alle espressioni regolari :-)
"Divivi" l'IBAN in un array in un colpo solo evitando di usare tante funzioni left right mid.

Saluti
Marco (SE&O)
Intervento di kiks73 del 19-06-2010 ore 00:05
Plebeo
Plebeo
(2 interventi)
Iscritto il 09-06-2010
customsoft ha scritto:
lol

Consiglio un'occhiatina alle espressioni regolari :-)
"Divivi" l'IBAN in un array in un colpo solo evitando di usare tante funzioni left right mid.

Saluti
Marco (SE&O)

Quale sarebbe il vantaggio di utilizzare una regular expression per dividere l'IBAN? Mi sfugge e dubito che avrei impiegato meno tempo a scriverlo, e l'importante, a mio parere, è minimizzare il tempo scrittura del codice, teoria a parte.
La peculiarità di questa banale funzione comunque è quella di calcolare il resto della divisione ricorsivamente.

Enrico
Intervento di Stefano Buffoli a.k.a. tiger del 25-06-2010 ore 11:50, Ospitaletto (BS)
Plebeo
Plebeo
(1 intervento)
Iscritto il 23-04-2002
kiks73 ha scritto:
... e l'importante, a mio parere, è minimizzare il tempo scrittura del codice, teoria a parte.
...


ORRORE!!!!!!!!!!!

Ma sei proprio convinto di questo???????

Per carità sono pareri personali, comunque, dato che dici di voler minimizzare i tempi di scrittura del codice, perchè hai scritto una funzione ricorsiva per fare una cosa che si poteva fare in UNA riga di codice?

Replace(IBAN, " ", vbNullString)

ottiene lo stesso identico risultato della tua funzione ricorsiva "eliminaSpazi" dove peraltro, visto che vuoi risparmiare tempo per la scrittura del codice inserisci una variabile che poi non utilizzi e fai un controllo con IsNumeric di un valore sicuramente numerico, dato che il risultato della funzione InStr è un NUMERO >= 0.

Un po' di sana teoria, secondo me, una volta ogni tanto, non farebbe poi così male se servisse per scrivere del BUON codice.

Ciao
Stefano
Intervento di kiks73 del 25-06-2010 ore 12:24
Plebeo
Plebeo
(2 interventi)
Iscritto il 09-06-2010
Hai perfettamente ragione, quell'"elimina spazi" è il frutto di un copia incolla da una funzione di un vecchio progetto, forse dell'Access 2.0 quando probabilmente la funzione Replace non era ancora disponibile, scritta agli albori della esperienza in VB... e trascritta un pò di corsa :-)
tiger ha scritto:
kiks73 ha scritto:
... e l'importante, a mio parere, è minimizzare il tempo scrittura del codice, teoria a parte.
...


ORRORE!!!!!!!!!!!

Ma sei proprio convinto di questo???????

Per carità sono pareri personali, comunque, dato che dici di voler minimizzare i tempi di scrittura del codice, perchè hai scritto una funzione ricorsiva per fare una cosa che si poteva fare in UNA riga di codice?

Replace(IBAN, " ", vbNullString)

ottiene lo stesso identico risultato della tua funzione ricorsiva "eliminaSpazi" dove peraltro, visto che vuoi risparmiare tempo per la scrittura del codice inserisci una variabile che poi non utilizzi e fai un controllo con IsNumeric di un valore sicuramente numerico, dato che il risultato della funzione InStr è un NUMERO >= 0.

Un po' di sana teoria, secondo me, una volta ogni tanto, non farebbe poi così male se servisse per scrivere del BUON codice.

Ciao
Stefano
Intervento di Marco Zordan a.k.a. customsoft del 25-06-2010 ore 16:09, Arzignano (VI)
Cavaliere
Cavaliere

(108 interventi)
Iscritto il 14-02-2002
tiger ha scritto:
kiks73 ha scritto:
... e l'importante, a mio parere, è minimizzare il tempo scrittura del codice, teoria a parte.
...

ORRORE!!!!!!!!!!!

[...]

Stefano

Quoto Stefano :-) di cui per brevità quoto solo l'inizio :-D

Oggi ho ripreso in mano un vecchio codice Asp (ormai programmo solo in PHP) e visto anche l'intervento di Stefano mi è venuta voglia di riscrivere al volo come la vedrei io la funzione dell'articolo.

Ovviamente è migliorabile, ma mi pare un po più chiara...soprattutto in un'ottica di: "ci devo rimetter le mani fra ... non so quando" :-)
  1. ' Promemoria FORMATO IBAN
  2. ' - 2 lettere codice paese
  3. ' - 2 numeri codice CIN IBAN
  4. ' - 1 lettera codice CIN
  5. ' - 5 numeri ABI
  6. ' - 5 numeri CAB
  7. ' -12 numeri C/C - Conto Corrente
  8.  
  9. ' Promemoria FORMATO BBAN
  10. ' - 1 lettera codice CIN
  11. ' - 5 numeri ABI
  12. ' - 5 numeri CAB
  13. ' -12 numeri C/C - Conto Corrente
  14.  
  15. ' NOTE: 
  16. ' 1) le variabili vanno dichiarate all'inizio delle funzioni non nel mezzo
  17. ' 2) l'uscita dalle funzioni deve avvenire solo alla chiusura della funzione ... senno si diventa matti a trovare gli errori!
  18. ' 3) la codifica ungherese ti aiuta a ricordare che tipo di valori devono esserci nelle variabili 
  19. ' 4) il codice va "TRADOTTO" per essere inserito in uno script VB! Questo è codice ASP!
  20. ' 5) IL CODICE NON E' STATO TESTATO IN UN AMBIENTE REALE. E' SOLO A SCOPO ESPLICATIVO!!! SI DECLINA OGNI RESPONSABILITA' <img src="./nbbc/smileys/smile.gif" width="16" height="16" alt=":-)" title=":-)" class="bbcode_smiley" />
  21.  
  22. response.write CheckIBAN2("IT99A1234512345012345678901") ' < - response.write da "tradurre"  
  23.  
  24. Function CheckIBAN2(sIBAN) ' As String) < - codice da "tradurre" ... ecc.
  25.   ' definizione variabili 
  26.   Dim objRegExpr, aMatches, aChars, bCheckIBAN, sBBAN, sChar, nResult, x
  27.  
  28.   ' normalizzazione preliminare IBAN
  29.   sIBAN = Ucase(Replace(sIBAN, " ", ""))
  30.  
  31.   ' valori predefiniti
  32.   bCheckIBAN = true
  33.  
  34.   ' creo oggetto regex
  35.   Set objRegExpr = New RegExp
  36.  
  37.   ' Espressione regolare: Nazione - CIN IBAN - BBAN
  38.   objRegExpr.Pattern = "([A-Z]{2})([0-9]{2})([A-Z]{1}[0-9]{5}[0-9]{5}[0-9]{12})"
  39.   Set aMatches = objRegExpr.Execute(sIBAN)
  40.  
  41.   'puliamo la memoria quando non serve 
  42.   Set objRegExpr = nothing  
  43.  
  44.   if aMatches.count = 1 then 
  45.     sBBAN = aMatches(0).SubMatches(2) & aMatches(0).SubMatches(0) & aMatches(0).SubMatches(1)
  46.  
  47.     'If DLookup("NAZIONE", "CODICI_ISO_NAZIONI", "CODICE = '" & aMatches(0).SubMatches(0) & "'") = "" Then
  48.  
  49.       For x = 1 To Len(sBBAN)
  50.         sChar = Mid(sBBAN, x, 1) '< - eseguo solo 1 volta il mid
  51.         if IsNumeric(sChar) then
  52.           nResult = CLng(nResult & sChar) Mod 97
  53.         else
  54.           nResult = CLng(nResult & CStr(Asc(sChar) - 55)) Mod 97
  55.         end if
  56.       Next
  57.       if nResult  1 Then
  58.         bCheckIBAN = False
  59.       end If
  60.  
  61.     'else
  62.     '   bCheckIBAN = false
  63.     'end If
  64.   else
  65.     bCheckIBAN = false
  66.   end if
  67.  
  68.   CheckIBAN2 = bCheckIBAN
  69.  
  70. End Function
Copyright Programmazione.it™ 1999-2014. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.223 secondi.