METODOLOGÍA · COLOMBIA

Dígito de verificación del NIT colombiano

El NIT colombiano usa el algoritmo módulo 11 con pesos fijos aplicados de derecha a izquierda para calcular su dígito de verificación (DV). Esta página explica el algoritmo conceptualmente, incluye un ejemplo numérico completo, y enumera los edge cases que hacen que implementaciones simples fallen en producción. Sin consulta a la DIAN.

El algoritmo

El NIT (Número de Identificación Tributaria) es el identificador fiscal colombiano emitido por la DIAN, la autoridad tributaria de Colombia. Se compone de 9 dígitos principales más un guion y un dígito de verificación (DV), en el formato XXXXXXXXX-V. Por ejemplo, 900123456-7: los 9 dígitos base son 900123456 y el DV es 7.

El DV se calcula con el algoritmo módulo 11 usando los pesos fijos [3, 7, 13, 17, 19, 23, 29, 37, 41]. Los pesos se aplican de derecha a izquierda sobre los 9 dígitos base: el dígito más a la derecha se multiplica por 3, el siguiente por 7, y así sucesivamente hasta que el dígito más a la izquierda se multiplica por 41.

Se suman los productos, se calcula el resto de dividir la suma por 11, y entonces: si el resto es 0 o 1, el DV es igual al resto; en cualquier otro caso, el DV es 11 menos el resto. El DV siempre es un único dígito 0–9 — el NIT nunca produce una ‘K’ como sí ocurre con el RUT chileno.

Posición1  2  3  4  5  6  7  8  9
Peso (← der. a izq.)41 37 29 23 19 17 13  7  3

Ejemplo numérico paso a paso

Calculamos el dígito de verificación para el NIT base 890903938.

Dígitos8  9  0  9  0  3  9  3  8
Pesos (← der. a izq.)41 37 29 23 19 17 13  7  3
Productos328 333 0 207 0 51 117 21 24
Suma328+333+0+207+0+51+117+21+24 = 1081
1081 mod 11= 3 (1081 = 98×11 + 3)
Resto ≠ 0 y ≠ 111 − 3 = 8
NIT890903938-8

Pseudocódigo

weights = [3, 7, 13, 17, 19, 23, 29, 37, 41]   // index 0 = rightmost digit
digits = strip_non_numeric(base)               // 9 digits, left-to-right
sum = Σ digits_reversed[i] × weights[i]  for i in 0..8
remainder = sum mod 11
if remainder == 0 or remainder == 1  → check_digit = remainder
else                                 → check_digit = 11 − remainder
return check_digit == provided_dv

Edge cases que una implementación simple no maneja

  • Alineación de pesos de derecha a izquierda: la DIAN asigna los pesos de derecha a izquierda, así que el dígito más a la derecha de los 9 se multiplica por 3 y el más a la izquierda por 41. Un off-by-one en la alineación de pesos es el bug de implementación #1 — invierte la asignación y todos los DV salen mal.
  • resto 0 o 1 → DV = resto: a diferencia del Mod-11 clásico que hace 11 − resto siempre, el NIT devuelve el resto directamente cuando es 0 o 1. Implementaciones que aplican 11 − resto sin esta excepción producen DV de 11 o 10, que son imposibles.
  • El DV siempre es 0–9, nunca ‘K’:el NIT nunca genera un dígito verificador no numérico como sí hace el RUT chileno. Si tu validación contempla ‘K’ para el NIT, está copiada de otro país.
  • NIT de personas naturales = Cédula de Ciudadanía + DV: el NIT de una persona natural suele ser su número de cédula con el DV calculado y agregado. La misma fórmula módulo 11 aplica, sin importar la longitud de la cédula base.
  • Primer dígito de empresas usualmente 8 o 9: los NIT de personas jurídicas suelen comenzar con 8 o 9. Esto es una convención de asignación, no una regla del checksum — no la uses como única validación.
  • Ceros a la izquierda y guion: entradas como 0900123456-7, 900123456-7 o 9001234567 deben normalizarse (quitar el guion, conservar los ceros) antes de calcular. Tratar el NIT como entero pierde ceros iniciales y desplaza la alineación de pesos.
  • Entrada no numérica: NIT pegado a texto ("NIT 900123456-7"), espacios, puntos de miles (900.123.456-7) o caracteres Unicode invisibles deben extraerse y limpiarse antes de validar, o el conteo de dígitos será incorrecto.
  • Longitud variable de la base: aunque el caso típico de empresa son 9 dígitos base, algunas cédulas usadas como NIT de persona natural tienen otra cantidad de dígitos. Aplica los pesos desde la derecha y trunca el arreglo de pesos a la longitud real de la base.
  • Confusión NIT vs DV en el mismo campo: sistemas que almacenan NIT y DV juntos vs separados producen inconsistencias. Verifica si el campo incluye o no el guion + DV antes de recalcular.
  • Sin consulta a la DIAN: el checksum confirma que el DV es consistente con la base, pero no confirma que el NIT exista, esté activo o corresponda a la razón social declarada. Eso requiere consultar el registro RUT de la DIAN.

¿Querés saltarte todo esto?

Manejar todos estos edge cases en producción cuesta semanas de testing y mantenimiento permanente conforme cambian las reglas regulatorias. La API de Normadata maneja todo lo de arriba — incluyendo los casos que ni listamos aquí — con una sola llamada REST.

Fuentes

DIAN — especificación pública del algoritmo módulo 11 para el dígito de verificación del NIT. El algoritmo es de conocimiento público y ha sido implementado por múltiples integraciones tributarias en Colombia.