function piva(p) {

result = FALSE;

if ((Len(p) NEQ 11) OR NOT IsNumeric(p))
break;
else {

tot = 0;
i = 1;

/**
* Somma le 5 posizioni dispari (eccetto la 11 che e' un
* carattere di controllo)
*
*/
while (i LT 11) {
tot = tot + Mid(p, i, 1);
i = i + 2;
}
i = 2;

/* posizioni pari */

while (i LT 11) {

/* raddoppia ogni singola posizione pari... */
x = Mid(p, i, 1) * 2;

/**
* ...aggiunge x alla somma delle dispari
* Se x e' maggiore di 10, viene ridotta
* alla somma della parte delle decine e delle
* unita' (es: 15 diventa 1+5)
*
*/

tot = tot + ( x \ 10 ) + ( x mod 10 );
i = i + 2;
}

x = tot;

if ((x mod 10 EQ 0) AND (Mid(p, 11, 1) EQ 0))
result = TRUE;
else if ( 10 - ( x mod 10) EQ Mid(p, 11, 1))
result = TRUE;
else
result = FALSE;

}

</cfscript>



Ciao,
dover