validacion NIT y RUT de la DIAN

acehart

Lanero Reconocido
14 Sep 2004
488
Hola, quisiera saber si alguien tiene el algoritmo para la generación del digito de verificacion de la DIAN para el NIT y el RUT


Me refiero a la formula matematica, no se si es la misma en ambos casos, no he encontrado en internet la formula.

Gracias.
 
Según se estos numeros se generan sin ningun tipo de calculo matematico. El digito de verificación logicamente si tiene un algoritmo de calculo pero lo desconozco.
 
Los digitos de verificacion se generan dependiendo del tipo de empresa que esta registrando, no tienen nada que ver los algoritmos ni nada por el estilo.

Ademas.......exactamente para que necesitas la formula de calculo de los numeros??
 
El digito de verificacion depende de ante que empresa se esta haciendo un tramite, yo realice un software para el pago de aporte a ISS en MedioMagnetico y ellos me dieron la formula matemática para su verificación.
 
Última edición:
Mejor dicho, necesito el algorimo de generación del digito de verificación del NIT y del RUT.

Es para un cliente que quiere que le validen eso para cuando ingresa los datos del cliente en un programa.
 
bueno encontre este codigo hecho en visual foxpro para el NIT:

select 6
if trim(tempnit.tipo) = "NIT"
d = 0
digito1 = "41372923191713 7 3"
nit1=substr(str(nit),2,9)
nnit=" "
N=1
do while n<=len(nit1)
d = d + val(trim(substr(digito1,n*2-1,2)))*val(substr(nit1,n,1))
n=n+1
enddo
d=mod(d,11)
if d > 1
d = 11 - d
endif
d=substr(str(d),10,1)
nnit=nit1+"-"+d
replace tempnit.digito with d
thisform.pageframe1.page2.text6.visible = .t.
thisform.pageframe1.page2.text6.refresh()
thisform.pageframe1.page2.label8.visible = .t.
thisform.pageframe1.page2.text6.refresh()
else
replace tempnit.digito with " "
endif
 
********************************************************
* FUNCION : Nit_DV
* FUNCION : Devuelve el Digito de Verificacion de un Nit (COLOMBIA)
* PARAMETROS : Numero de Nit a Calcular
* RETORNO : Digito de Verificación
* AUTOR : Nelson Cortes (nelson_cortes@tutopia.com)
********************************************************
FUNCTION Nit_DV(_Nit)
LOCAL _TipoRet, lnRetorno, Arreglo_PA, WSuma, WDato, WDig_Ver, I
_TipoRet = VARTYPE(_Nit)
DO CASE
CASE _TipoRet == "C"
_Nit = ALLTRIM(_Nit)
CASE _TipoRet == "N" OR _TipoRet == "Y"
_Nit = ALLTRIM(STR(_Nit))
OTHERWISE
=MESSAGEBOX("El valor de entrada NIT no se ha podido procesar.",0+48,_SCREEN.cNomApp)
RETURN
ENDCASE
DIMENSION Arreglo_PA(15)
Arreglo_PA(1) = 71
Arreglo_PA(2) = 67
Arreglo_PA(3) = 59
Arreglo_PA(4) = 53
Arreglo_PA(5) = 47
Arreglo_PA(6) = 43
Arreglo_PA(7) = 41
Arreglo_PA(8) = 37
Arreglo_PA(9) = 29
Arreglo_PA(10) = 23
Arreglo_PA(11) = 19
Arreglo_PA(12) = 17
Arreglo_PA(13) = 13
Arreglo_PA(14) = 7
Arreglo_PA(15) = 3
lnRetorno = 0
WDato=RIGHT(SPACE(15)+ALLTRIM(_Nit),15)
WSuma=0
WDig_Ver=0
FOR I = 1 TO 15
WSuma=WSuma+(VAL(SUBSTR(WDato,I,1))*Arreglo_PA(I))
ENDFOR
WSuma=MOD(WSuma,11)
IF(WSuma=0 .OR. WSuma=1)
lnRetorno = WSuma
ELSE
lnRetorno = 11 - WSuma
ENDIF
IF _TipoRet == "C"
RETURN ALLTRIM(STR(lnRetorno))
ELSE
RETURN lnRetorno
ENDIF
ENDFUNC
 
te voy a explicar, el algoritmo se llama modulo 11, y consiste en coger todo el nit y separar cada digito, se multiplica con el respectivo numero primo, al finalizar se realizan las sumas de los productos de cada digito y el acumulado se divide en 11, si el residuo es 0 ó 1 el d.v es ese residuo, si es diferente, a 11 se le resta ese residuo y el resultado es el d.v
 
En Java, ¡facilísimo!:

Código:
public byte generarDv(long nit) {        
        int[] nums = {
            3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71
        };

        int sum = 0;

        String str = String.valueOf(nit);
        for (int i = str.length() - 1, j=0; i >= 0; i--, j++) {
            suma += Character.digit(str.charAt(i), 10) * nums[j];
        }

        byte dv = (byte)((sum % 11) > 1 ? (11 - (sum % 11)) : (sum % 11));
        return dv;
}
 
la verdad trate de hacerla en excel y no me concuerda con la realidad, es decir para el nit 831199125 el DV es 1 y en la formula me sale q seria 7
adjunto el archivo para su revision
 

Archivos adjuntos

  • nit.zip
    6.9 KB · Visitas: 686
Hola, aca les dejo mi pequeño aporte en Delphi:

Código:
function DigVerNIT(NIT : String) : Boolean; 
const 
Pesos: array[0..11] of integer=(53,47,43,41,37,29,23,19,17,13,7,3); 
var 
cont : Integer; 
suma : Integer; 
DV : Integer; 
begin 
Result := False; 
suma := 0; 
NIT := AlineaD(NIT,12,'0'); 

For cont := 0 to 11 do 
suma := suma + StrToInt(Copy(NIT, cont, 1)) * Pesos[cont]; 

DV := 11 - suma mod 11; 

if (DV > 9) then 
  DV:= 1 - DV mod 10; 

if StrToInt(Copy(NIT, 12, 1)) = DV then 
  Result := True; 
end;
 
Digito de Verificacion

Esta es la formula en Excel

*El numero del nit debe estar en la celda C1

* En la celda E1 colocas lo siguiente "=SI(F1=0,0,SI(F1=1,1,11-F1))" Sin las comillas

* Y en la celda F1 Colocas esto "=RESIDUO((VALOR(EXTRAE(TEXTO(C1,"000000000000000"),15,1))*3+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),14,1))*7+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),13,1))*13+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),12,1))*17+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),11,1))*19+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),10,1))*23+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),9,1))*29+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),8,1))*37+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),7,1))*41+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),6,1))*43+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),5,1))*47+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),4,1))*53+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),3,1))*59+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),2,1))*67+VALOR(EXTRAE(TEXTO(C1,"000000000000000"),1,1))*71),11)" Sin las comillas


Y listo ya esta. El resultado se muestra en la celda E1
Pruebalo y me cuentas... a mi me funciona.
 
disel gracias
he probado la formula y no me funciono si no es mucha molestia te adjunto el archivo para q por favor revises la formula y me guies

gracias
 

Archivos adjuntos

  • DV NIT.zip
    1.6 KB · Visitas: 606
Algoritmo en JavaScript

Hola laneros!

Anexo mi aporte en JavaScript.

Mil gracias a todos los que han aportado a este tema, me solucionaron un problema muy importante que tengo en un proyecto.

El código está basado en el script publicado por acehart.

Que lo disfruten!!

================================

function zero_fill(i_valor, num_ceros) {
relleno = ""
i = 1
salir = 0
while ( ! salir ) {
total_caracteres = i_valor.length + i
if ( i > num_ceros || total_caracteres > num_ceros )
salir = 1
else
relleno = relleno + "0"
i++
}

i_valor = relleno + i_valor
return i_valor
}

function calcularDV(i_rut) {
var pesos = new Array(71,67,59,53,47,43,41,37,29,23,19,17,13,7,3);
rut_fmt = zero_fill(i_rut, 15)
suma = 0
for ( i=0; i<=14; i++ )
suma += rut_fmt.substring(i, i+1) * pesos
resto = suma % 11
if ( resto == 0 || resto == 1 )
digitov = resto
else
digitov = 11 - resto

return(digitov)
}
 
Este dígito de verificación aplica para todos los NIT registrados en Colombia?. gracias. pronto aporto mi código de phyton.
 
Yo utilizo Openoffice Calc y para calcular el DV les dejo y me ha funcionado, espero que le funcione a alguien más.

Como ejemplo vamos a utilizar la primera fila de las columnas: "A", "B", "D", por lo tanto...

"A1" Donde digitamos las cédulas

"B1" Donde visualizaremos los DVs

"D1" Donde se "calcularán" una parte los datos.

1. Copiamos y pegamos la siguiente fórmula en la celda "B1"

=SI(D1=0;0;SI(D1=1;1;11-D1))

2. Copiamos y pegamos la siguiente fórmula en la celda "D1"

=RESIDUO((VALOR(EXTRAE(TEXTO(A1;"000000000000000");15;1))*3+VALOR(EXTRAE(TEXTO(A1;"000000000000000");14;1))*7+VALOR(EXTRAE(TEXTO(A1;"000000000000000");13;1))*13+VALOR(EXTRAE(TEXTO(A1;"000000000000000");12;1))*17+VALOR(EXTRAE(TEXTO(A1;"000000000000000");11;1))*19+VALOR(EXTRAE(TEXTO(A1;"000000000000000");10;1))*23+VALOR(EXTRAE(TEXTO(A1;"000000000000000");9;1))*29+VALOR(EXTRAE(TEXTO(A1;"000000000000000");8;1))*37+VALOR(EXTRAE(TEXTO(A1;"000000000000000");7;1))*41+VALOR(EXTRAE(TEXTO(A1;"000000000000000");6;1))*43+VALOR(EXTRAE(TEXTO(A1;"000000000000000");5;1))*47+VALOR(EXTRAE(TEXTO(A1;"000000000000000");4;1))*53+VALOR(EXTRAE(TEXTO(A1;"000000000000000");3;1))*59+VALOR(EXTRAE(TEXTO(A1;"000000000000000");2;1))*67+VALOR(EXTRAE(TEXTO(A1;"000000000000000");1;1))*71);11)

Si desea utilizar una celda diferente para introducir las cédulas, basta con cambiar las referencias "A1" (sin las comillas) de la formula anterior, que es donde ubicamos las cédulas. Y asi mismo con la fórmula del paso #2 hay que cambiar "D1" por por la celda donde ubicó la fórmula del paso #2.
 

Los últimos temas