25.2.13

¿Cómo se calcula el dígito verificador del RUT?

Hay diversos números que se asignan para controlar un dato. Generalmente se les llama "controlador" y están presentes en códigos o series de números que tienen la particularidad de ser únicos. Es el caso del RUT (Rol Único Tributario), el cual identifica a cada persona natural o jurídica en Chile, cuyo último número se denomina dígito verificador. Pero, ¿cómo se calcula este?

El RUT consiste en una serie de números que anteceden al dígito verificador. Por ejemplo, el RUT puede ser 12.956.784-X. Agrego una X, porque es justamente ese número (el dígito verificador) el que debemos calcular. Entonces, para el cálculo hay que hacer lo siguiente:

1- Invertir el orden de los dígitos del RUT, que para nuestro ejemplo quedaría: 4 8 7 6 5 9 2 1.

2- Cada número, en el orden planteado, se debe multiplicar por la siguiente serie: 2, 3, 4, 5, 6, 7. Si los números del RUT superan los 6 digitos, deberá comenzar la serie desde el comienzo. Para nuestro ejemplo, la multiplicación sería:

4 x 2 = 8
8 x 3 = 24
7 x 4 = 28
6 x 5 = 30
5 x 6 = 30
9 x 7 = 63
2 x 2 = 4
1 x 3 = 3

3- Se deben sumar los resultados obtenidos. En nuestro ejemplo, la suma total es:

8 + 24 + 28 + 30 + 30 + 63 + 4 + 3 = 190

4- Dividir el número obtenido por 11 y obtener el resto. Para el caso presentado aquí, sería:

190 ÷ 11 = 17 con un resto igual a 3

5- El resultado que necesitamos es la resta entre 11 y el resto obtenido en el paso anterior. Para este ejemplo, obtendríamos:

11 - 3 = 8

Existen 3 posibilidades para obtener el digito verificador dependiendo del resultado obtenido en el último paso. Si el número obtenido es 1, 2, 3, 4, 5, 6, 7, 8 ó 9; ése es el dígito verificador; si el número obtenido es 11, el dígito verificador es 0; y si el número obtenido es 10, el dígito verificador es K.

Por tanto, para el ejemplo presentado, el dígito verificador es el 8, por lo cual el RUT es 12.956.784-8 

11 comentarios:

Rocio Muñoz Muñoz dijo...

y de donde sale el 3 ? si el resultado es 17 ? como eso del resto ?

@lasnibat dijo...

Rocío,
Esto es porque si multiplicamos 17 x 11 el resultado es 187. Como nuestro número es 190, nos sobran (o faltan) 3 el cual se denomina resto.
Cualquier cosa, me dices.
Saludos,
T.

iván aburto dijo...

...Por favor prueben con éste rut
15109054, el dígito supuestamente es "cero"

Pablo Videla dijo...

Muchas gracias por tu ejemplo, con esto pude crear un bosquejo de un codigo en php para generar el digito verificador de un rut, comparto el codigo para que alguien mas le sirva de muestra, como te digo, el codigo es solo una prueba por lo tanto no esta eficiente asi que arreglenlo para su uso xD, saludos y gracias nuevamente.


$rut = "15109054";
$eliminarElementos = "/[-][0-9]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-][k]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-][K]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[.]/";
$rut = preg_replace($eliminarElementos, "", $rut);

$multiplicaciones = array();
$multiplicaciones[0] = 2;
$multiplicaciones[1] = 3;
$multiplicaciones[2] = 4;
$multiplicaciones[3] = 5;
$multiplicaciones[4] = 6;
$multiplicaciones[5] = 7;
$multiplicaciones[6] = 2;
$multiplicaciones[7] = 3;
$multiplicaciones[8] = 4;
$multiplicaciones[9] = 5;
$multiplicaciones[10] = 6;
$multiplicaciones[11] = 7;

$formula = "";
$suma = 0;
for ($i = strlen($rut); $i >= 0; $i--) {
$formula.=$rut[$i];
}
for ($i = 0; $i < strlen($rut); $i++) {
echo "Suma : $suma y multiplicando $formula[$i] * $multiplicaciones[$i]
";
$suma = $suma+$multiplicaciones[$i]*$formula[$i];
}
echo "La suma total es $suma
";
$resultadoResto = $suma%11;
echo "El resultado del resto es $resultadoResto
";
$resultadoDigitoVerificador = 11-$resultadoResto;
switch($resultadoDigitoVerificador){
case "11":
$resultadoDigitoVerificador=0;
break;
case "10":
$resultadoDigitoVerificador="k";
break;
}
echo "El digito verificador es $resultadoDigitoVerificador
";

echo "Rut invertido $formula";

Pablo Videla dijo...

Hola nuevamente, vengo a dejar el codigo corregido.


$rut = "15109054";
$eliminarElementos = "/[-][0-9]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-][k]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-][K]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[-]/";
$rut = preg_replace($eliminarElementos, "", $rut);
$eliminarElementos = "/[.]/";
$rut = preg_replace($eliminarElementos, "", $rut);

$multiplicaciones = array();
$multiplicaciones[0] = 2;
$multiplicaciones[1] = 3;
$multiplicaciones[2] = 4;
$multiplicaciones[3] = 5;
$multiplicaciones[4] = 6;
$multiplicaciones[5] = 7;

$formula = "";
$suma = 0;
$contadorMultiplo = 0;

for ($i = strlen($rut); $i >= 0; $i--) {
$formula.=$rut[$i];
}
for ($i = 0; $i < strlen($rut); $i++) {
if ($i == count($multiplicaciones)) {
$contadorMultiplo = 0;
}
echo "Suma : $suma y multiplicando $formula[$i] * $multiplicaciones[$contadorMultiplo]
";
$suma = $suma + $multiplicaciones[$contadorMultiplo] * $formula[$i];
$contadorMultiplo++;
}
echo "La suma total es $suma
";
$resultadoResto = $suma % 11;
echo "El resultado del resto es $resultadoResto
";
$resultadoDigitoVerificador = 11 - $resultadoResto;
switch ($resultadoDigitoVerificador) {
case "11":
$resultadoDigitoVerificador = 0;
break;
case "10":
$resultadoDigitoVerificador = "k";
break;
}
echo "El digito verificador es $resultadoDigitoVerificador
";

echo "Rut invertido $formula";

sgarreton dijo...

Y SI EL RUT ES DE UNA PERSONA VIEJA CON UN NUMERO MENOS EL RUT xd ?

sleipner dijo...
Este comentario ha sido eliminado por el autor.
sleipner dijo...

NO funciona, el dígito verificador que sale no es correcto

meme meme dijo...


Esta es una función que se puede crear en VB para excel, una variante como opción:

Function VerificaRut(RUT As String) As String 'string por la K
'calcula el dígito verificador
'queda disponible en bibliotecas de fórmulas si está grabada en libro de macros personal

Dim N1 As Byte, N2 As Byte, N3 As Byte, N4 As Byte, N5 As Byte, N6 As Byte, N7 As Byte, N8 As Byte
Dim Suma As Integer, difSuma As Integer

If Len(RUT) = 7 Then 'LARGO DEL RUT es para los que son menores a 10 millones
RUT = "0" & RUT
End If

N1 = Mid(RUT, 8, 1) * 2
N2 = Mid(RUT, 7, 1) * 3
N3 = Mid(RUT, 6, 1) * 4
N4 = Mid(RUT, 5, 1) * 5
N5 = Mid(RUT, 4, 1) * 6
N6 = Mid(RUT, 3, 1) * 7
N7 = Mid(RUT, 2, 1) * 2
N8 = Mid(RUT, 1, 1) * 3
Suma = N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8
difSuma = 11 - (Suma Mod 11) 'mod es equivalente a la funcion residuo de excel (resto)

If difSuma = 10 Then
VerificaRut = "K"
ElseIf difSuma = 11 Then
VerificaRut = 0
Else
VerificaRut = difSuma
End If
End Function

Valeria Sofia Medel dijo...

20026809-
Porfa k alguien me ayude con él mio

Orlando dijo...

En el código de php de @PabloVidela, el primer ciclo for debe partir de strlen($rut)-1

ERROR: Uninitialized string offset