Dígito de control de una cuenta corriente
Este código en PHP permite calcular el dígito de control de un número de cuenta bancario español.
/**
* Calcula el dígito de control de un número de cuenta CCC (código cuenta cliente)
*
* @todo No verifica la longitud de las cadenas
*/
function calcular_dc($entidad, $oficina, $cuenta){ // v2010-11-02
$dc = "";
$pesos = array(6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
// Primer dígito de control (entidad y oficina)
$suma = 0;
$cadena = $entidad . $oficina;
for($i=0, $len=strlen($cadena); $i<$len; $i++){
$suma += $pesos[$i] * substr($cadena, $len-$i-1, 1);
}
$digito = 11-$suma%11;
if($digito==11){
$digito = 0;
}elseif($digito==10){
$digito = 1;
}
$dc = $digito;
// Segundo dígito de control (número de cuenta)
$suma = 0;
for($i=0, $len=strlen($cuenta); $i<$len; $i++){
$suma += $pesos[$i] * substr($cuenta, $len-$i-1, 1);
}
$digito = 11-$suma%11;
if($digito==11){
$digito = 0;
}elseif($digito==10){
$digito = 1;
}
$dc .= $digito;
return $dc;
}
(Confío en que no se trate de un secreto industrial; es imposible encontrar en Google ninguna referencia oficial sobre el formato).
Versión multi-byte
Si la aplicación utiliza UTF-8 u otro juego de caracteres multi-byte el algoritmo es el mismo pero necesitamos usar las funciones de manejo de caracteres apropiadas:
/**
* Calcula el dígito de control de un número de cuenta CCC (código cuenta cliente)
*
* Los parámetros de entrada se manejan como cadenas multi-byte
*
* @todo No verifica la longitud de las cadenas
*/
function mb_calcular_dc($entidad, $oficina, $cuenta){ // v2010-08-31
$dc = "";
$pesos = array(6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
// Primer dígito de control (entidad y oficina)
$suma = 0;
$cadena = $entidad . $oficina;
for($i=0, $len=mb_strlen($cadena); $i<$len; $i++){
$suma += $pesos[$i] * mb_substr($cadena, $len-$i-1, 1);
}
$digito = 11-$suma%11;
if($digito==11){
$digito = 0;
}elseif($digito==10){
$digito = 1;
}
$dc = $digito;
// Segundo dígito de control (número de cuenta)
$suma = 0;
for($i=0, $len=mb_strlen($cuenta); $i<$len; $i++){
$suma += $pesos[$i] * mb_substr($cuenta, $len-$i-1, 1);
}
$digito = 11-$suma%11;
if($digito==11){
$digito = 0;
}elseif($digito==10){
$digito = 1;
}
$dc .= $digito;
return $dc;
}