Función para calcular el digito verificador del RUC

Digito verificador o algoritmo de control, es un mecanismo de autenticación que se utiliza para verificar y validar la autenticidad de un valor numérico y así evitar fraudes o errores de transmisión o de tipeado.

Consiste en uno o mas algoritmos agregados al valor original y calculados por medio de un determinado algoritmo. Números de documentos de identificación, chapas, cartones de crédito, RUC, o cualquier otro tipo de documento que requiera que los números tengan mayor seguridad. Para esto se utilizan los dígitos verificadores.

Para el calculo del digito verificador del RUC se utiliza al algoritmo llamado Módulo 11.

Para calcular el primer digito verificador, cada dígito del número, comenzando desde la derecha para izquierda (del dígito menos significativo para el mas significativo) se multiplica en el orden por 2, por 3, luego por 4 y así sucesivamente, hasta llegar al primer dígito del número. La sumatoria de esa multiplicación se divide por 11. El resto de esa división (módulo 11) se substrae de la base (11) y el resultado es el digito verificador. Para calcular el próximo digito, se considera el anterior como parte del numero y se efectúa el mismo proceso.

FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN PL/SQL

CREATE OR REPLACE FUNCTION Pa_Calcular_Dv_11_A ( p_numero IN VARCHAR2,

p_basemax IN NUMBER DEFAULT 11) RETURN NUMBER IS

/*
Calcula Digito Verificador numérico con entrada alfanumérica y basemax 11*/
v_total
v_resto
k
v_numero_aux NUMBER(1); v_numero_al VARCHAR2(255); v_caracter VARCHAR2(1); v_digit NUMBER;

BEGIN
-- Cambia la ultima letra por ascii en caso que la cedula termine en letra FOR i IN 1 .. LENGTH(p_numero) LOOP

v_caracter := UPPER(SUBSTR(p_numero,i,1));
IF ASCII(v_caracter) NOT BETWEEN 48 AND 57 THEN -- de 0 a 9

v_numero_al := v_numero_al || ASCII(v_caracter); ELSE

v_numero_al := v_numero_al || v_caracter; END IF;

END LOOP;
-- Calcula el DV k := 2;

v_total := 0;

FOR i IN REVERSE 1 .. LENGTH(v_numero_al) LOOP IF k > p_basemax THEN

k := 2;
END IF;
v_numero_aux := TO_NUMBER(SUBSTR(v_numero_al,i,1)); v_total := v_total + (v_numero_aux * k);
k := k + 1;

END LOOP;

v_resto := MOD(v_total,11);

IF v_resto > 1 THEN v_digit := 11 - v_resto;

ELSE
v_Digit := 0;

END IF;

RETURN v_Digit; END;

FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN VISUAL BASIC

Function getDV(RUC As String) As String
NUMBER(6); NUMBER(2);
NUMBER(2);
getDV = calcular(RUC, 11) End Function

Function calcular(numero As String, basemax As Integer) As String Dim codigo As Long
Dim numero_al As String

Dim i
For i = 1 To Len(numero)

Dim c
c = Mid$(numero, i, 1)
codigo = Asc(UCase(c))
If Not (codigo >= 48 And codigo <= 57) Then

numero_al = numero_al & codigo Else

numero_al = numero_al & c End If

Next

Dim k: Dim total k=2
total = 0

For i = Len(numero_al) To 1 Step -1
If (k > basemax) Then k = 2
Dim numero_aux
numero_aux = Val(Mid(numero_al, i, 1)) total = total + (numero_aux * k) k=k+1

Next

Dim resto: Dim digito resto = total Mod 11 If (resto > 1) Then

digito = 11 - resto Else

digito = 0 End If

calcular = digito End Function

FUNCION PARA EL CALCULO DEL DIGITO VERIFICADOR EN LENGUAJE C

#include 
#include 
#include

int Pa_Calcular_Dv_11_A (const char *p_numero, int p_basemax) {

// CALCULO Digito verificador - RUC // AUTOR: Luis Francou.
int v_total, v_resto, k, v_numero_aux, v_digit; char *v_numero_al, *p;
char v_caracter;
int i;

v_numero_al = (char *) malloc (strlen(p_numero) + 1); memset(v_numero_al, 0, strlen(p_numero)+1);

while (v_caracter = *p_numero++, v_caracter != 0) {

if (v_caracter >= '0' && v_caracter <= '9') sprintf(v_numero_al, "%s%c", v_numero_al, v_caracter);

else {
sprintf(v_numero_al, "%s%d", v_numero_al, v_caracter);

} }

k = 2;
v_total = 0;
i = strlen(v_numero_al) - 1 ; p = v_numero_al + i++;

while (i--) {

k = k > p_basemax ? 2 : k; v_numero_aux = *(p--) - 48; v_total += v_numero_aux * k++;

}

v_resto = v_total % 11;
v_digit = v_resto > 1 ? 11 - v_resto : 0;

free(v_numero_al);

return v_digit; }

11 comentarios en “Función para calcular el digito verificador del RUC”

  1. CREATE OR REPLACE FUNCTION XXR_VALIDA_RUC(P_numero_RUC VARCHAR2) RETURN VARCHAR2 IS
    ln_start INTEGER := 1;
    ln_max INTEGER := 6;
    ln_curr INTEGER;
    ln_base INTEGER := 11;
    ln_total INTEGER := 0;
    ln_last_digit INTEGER;
    BEGIN
    FOR I IN 1..10 LOOP
    if ln_curr > ln_max or ln_curr is null then
    ln_curr := ln_start + 1;
    else
    ln_curr := ln_curr + 1;
    end if;
    ln_total := ln_total + (ln_curr *substr(P_numero_RUC,(ln_base-i),1));
    END LOOP;
    ln_last_digit :=ln_base-(ln_total-FLOOR((ln_total/ ln_base))*ln_base);
    IF ln_last_digit > 9 THEN
    ln_last_digit := SUBSTR(ln_last_digit,2,1);
    END IF;
    IF SUBSTR(P_numero_RUC,11,1) = ln_last_digit THEN
    RETURN ‘Y’;
    ELSE
    RETURN ‘N’;
    END IF;
    END;

  2. //Funcion en PHP
    function digitoVerificador($numero){
    $suma = 0;
    for ($i = 0; $i 1 ? 11 – $resto : 0;

    }

    echo $numero = 4658651;echo ‘-‘;
    echo digitoVerificador($numero);

  3. Alguien que me ayude a pasar este código php a función sql.

    function validarRuc($valor) {
    $valor = trim($valor);
    if ($valor) {
    if (strlen($valor) == 11) { // RUC
    $suma = 0;
    $x = 6;
    for ($i = 0; $i = 10) {
    $resto = $resto – 10;
    }
    if ($resto == $valor[strlen($valor) – 1]) {
    return true;
    }
    }
    }
    return false;
    }

    Po favor.

  4. Calculado como se indica en: https://es.wikipedia.org/wiki/C%C3%B3digo_de_control
    /** PHP **/

    function digitoVerificador ($cedula) {
    $sumatoria = 0;
    $factor = 2;
    for ($i = strlen($cedula) – 1; $i >= 0; $i–) {
    $sumatoria += $factor * substr($cedula, $i, 1);
    $factor++;
    if ($factor > 7) {
    $factor = 2;
    }
    }
    $digito = 11 – $sumatoria % 11;
    if ($digito < 10) {
    return $digito;
    } elseif ($digito == 11) {
    return 0;
    } else { // El resultado es 10
    return 1;
    }
    }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.