validacion NIT y RUT de la DIAN

acehart

Lanero Reconocido
Se unió
14 Sep 2004
Mensajes
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.
 

KERBEROS

Lanero Reconocido
Se unió
30 Sep 2001
Mensajes
7,364
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.
 

[Dn] KiKe

V Rider
Miembro del equipo
Se unió
6 Abr 2002
Mensajes
14,379
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??
 

Whidney

Lanero Reconocido
Se unió
27 Nov 2003
Mensajes
128
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:

acehart

Lanero Reconocido
Se unió
14 Sep 2004
Mensajes
488
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.
 

acehart

Lanero Reconocido
Se unió
14 Sep 2004
Mensajes
488
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
 

acehart

Lanero Reconocido
Se unió
14 Sep 2004
Mensajes
488
********************************************************
* 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
 

dNxEtOr

Lanero Reconocido
Se unió
23 Abr 2004
Mensajes
190
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
 

AIRJAGS

Lanero Activo
Se unió
17 Ene 2008
Mensajes
4
dNxEtOr
una pregunta al respecto cuando por ejem el NIT tiene 0 este por que numero primo lo debo multiplicar
 

Raddictus

Lanero Reconocido
Se unió
25 Abr 2008
Mensajes
195
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;
}
 

Raddictus

Lanero Reconocido
Se unió
25 Abr 2008
Mensajes
195
Y no existe una formula para excel o visual basic?
Dudo que exista una predefinida por lo que es algo muy específico, pero fácilmente se podría crear una propia teniendo en cuenta los algoritmos publicados en el foro.
 

AIRJAGS

Lanero Activo
Se unió
17 Ene 2008
Mensajes
4
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
 

Adjuntos

HsolraC

Lanero Camellador
Se unió
14 Jun 2004
Mensajes
1,773
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;
 

Disel

Lanero Activo
Se unió
2 Dic 2008
Mensajes
1
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.
 

AIRJAGS

Lanero Activo
Se unió
17 Ene 2008
Mensajes
4
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
 

Adjuntos

masterwaldo

Lanero Activo
Se unió
16 Ene 2009
Mensajes
1
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)
}
 

mfrl

Lanero Reconocido
Se unió
30 Mar 2008
Mensajes
106
Este dígito de verificación aplica para todos los NIT registrados en Colombia?. gracias. pronto aporto mi código de phyton.
 

surrend

Lanero Reconocido
Se unió
13 Jun 2006
Mensajes
10
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.
 
Arriba