Calcular Digito de Verificacion
Publicado por Paul Martinez (1 intervención) el 02/06/2006 22:59:49
Alguien tiene la formula para devolver o calcular el digito de verificacion a partir de un nit o numero de cedula? Gracias de antemano por la ayuda
public string ValidarDigitoVerificacion(string unNit)
{
string miTemp;
int miContador;
int miResiduo;
int miChequeo;
int[] miArregloPA = new int[15];
miArregloPA[0] = 3;
miArregloPA[1] = 7;
miArregloPA[2] = 13;
miArregloPA[3] = 17;
miArregloPA[4] = 19;
miArregloPA[5] = 23;
miArregloPA[6] = 29;
miArregloPA[7] = 37;
miArregloPA[8] = 41;
miArregloPA[9] = 43;
miArregloPA[10] = 47;
miArregloPA[11] = 53;
miArregloPA[12] = 59;
miArregloPA[13] = 67;
miArregloPA[14] = 71;
miChequeo = 0;
miResiduo = 0;
for(miContador = 0; miContador<unNit.Length;miContador++)
{
miTemp = unNit[(unNit.Length-1) - miContador].ToString();
miChequeo = miChequeo + (Convert.ToInt32(miTemp) * miArregloPA[miContador]);
}
miResiduo = miChequeo % 11;
if(miResiduo > 1)
return Convert.ToString(11 - miResiduo);
return miResiduo.ToString();
}
CREATE OR REPLACE FUNCTION ValidarDigitoChequeoNIT(chrNIT VARCHAR2) RETURN VARCHAR2 IS
BEGIN
DECLARE
intContador NUMBER;
intACUM NUMBER;
intRESTO NUMBER;
intLongIden NUMBER; --Longitud de la cadena identificación}
-- Arreglo
TYPE arregloPA IS TABLE OF NUMBER(2)
INDEX BY BINARY_INTEGER;
-- Variable de tipo arreglo
arrPA arregloPA;
arrDA arregloPA;
BEGIN
-- Válida el dígito de chequeo
SELECT Length(chrNIT) + 1
INTO intLongIden
FROM DUAL;
-- Llenar el arreglo PA, estos son números primos, según loe stablece el algoritmo
arrPA(1) := 3;
arrPA(2) := 7;
arrPA(3) := 13;
arrPA(4) := 17;
arrPA(5) := 19;
arrPA(6) := 23;
arrPA(7) := 29;
arrPA(8) := 37;
arrPA(9) := 41;
arrPA(10) := 43;
arrPA(11) := 47;
arrPA(12) := 53;
arrPA(13) := 59;
arrPA(14) := 67;
arrPA(15) := 71;
intContador := 1;
-- Llena el arreglo DA con la cadena de entrada que es el NIT
FOR intContador IN 1..intLongIden - 1 LOOP
arrDA(intContador) := TO_NUMBER(substr(chrNIT,intLongIden- intContador, 1));
END LOOP;
-- Llena con ceroas el resto de posiciones del arreglo
FOR intContador IN intLongIden..15 LOOP
arrDA(intContador) := 0;
END LOOP;
intACUM := 0;
FOR intContador IN 1..15 LOOP
intACUM := intACUM + (arrDA(intContador) * arrPA(intContador));
END LOOP;
-- Obtiene el modulo 11 del acumulado
intRESTO := MOD(intACUM,11);
IF (intRESTO > 1) THEN
return TO_CHAR(11 - intRESTO);
ELSE
return TO_CHAR(intRESTO);
END IF;
END;
END F_ValidarDigitoChequeoNIT;
--Variables
lng = char_length(trim(nit));
sqc = substring('716759534743413729231917130703' from (31 - (:lng * 2)));
idx = 1;
dvr = 0;
--Calculo sobre secuencia
while (:idx <= :lng) do
begin
--Sumo y multiplico
dvr = :dvr + (cast(substring(:sqc from 1 for 2) as integer) * cast(substring(nit from :idx for 1) as integer));
--Recorto secuencia y aumento indice
sqc = substring(:sqc from 3);
idx = :idx + 1;
end
--Obtengo digito de verificacion
dvr = 11 - (:dvr - (trunc(:dvr / 11) * 11));
CREATE FUNCTION [dbo].[ObtenerDigitoVerificadorColombia]
(
@Nit NVARCHAR(20)
)
RETURNS VARCHAR(1)
AS
BEGIN
DECLARE @dv INT
DECLARE @Lenght INT
DECLARE @SEQ NVARCHAR(30)
DECLARE @Contador INT
DECLARE @Multiplo INT
DECLARE @Acumulador INT
--Variables
set @Lenght = Len(LTRIM (RTRIM ((@Nit))))
set @SEQ = substring('716759534743413729231917130703', (31 - (@Lenght * 2)),31)
set @Contador = 1
set @dv = 0
--Calculo sobre secuencia
while (@Contador <= @Lenght)
begin
--Sumo y multiplico
set @dv = @dv + (cast(substring(@SEQ,1,2) as INT)) * (cast(substring(@Nit, @Contador, 1) as INT))
--Recorto secuencia y aumento indice
set @SEQ = substring(@SEQ,3,31)
set @Contador = @Contador + 1
end
--Obtengo digito de verificacion
set @dv = 11 - (@dv - (floor(@dv / 11) * 11))
RETURN @dv
END
GO
///
-- Obtiene el modulo 11 del acumulado
intRESTO := MOD(intACUM,11);
IF (intRESTO > 1) THEN
return TO_CHAR(11 - intRESTO);
ELSE
return TO_CHAR(intRESTO);
END IF;
/////
import java.util.Scanner;
public class pruebanit {
public static void main(String args[]) {
Scanner escaner = new Scanner(System.in);
int[] secu = new int[15];
String miTemp = "";
String NITs = "";
int miContador = 0;
int miResiduo = 0;
int miChequeo = 0;
secu[0] = 3;
secu[1] = 7;
secu[2] = 13;
secu[3] = 17;
secu[4] = 19;
secu[5] = 23;
secu[6] = 29;
secu[7] = 37;
secu[8] = 41;
secu[9] = 43;
secu[10] = 47;
secu[11] = 53;
secu[12] = 59;
secu[13] = 67;
secu[14] = 71;
System.out.println("NIT: ");
NITs = String.valueOf(escaner.nextInt());
for (miContador = 0; miContador < NITs.length(); miContador++) {
miTemp = NITs.substring(miContador, (miContador + 1));
miChequeo = miChequeo + Integer.parseInt(miTemp) * secu[(NITs.length() - 1) - miContador];
}
miResiduo = miChequeo % 11;
if (miResiduo > 1) {
miResiduo = 11 - miResiduo;
System.out.println("DV: " + miResiduo);
}else{
System.out.println("DV: " + miResiduo);
}
}
function dig_verf($doc)
{
if (is_numeric(trim($doc))) {
$secuencia = array(3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71);
$d = str_split(trim($doc));
krsort($d);
$cont = 0;
unset($val);
foreach ($d as $key => $value) {
$val[$cont] = $value * $secuencia[$cont];
$cont++;
}
$suma = array_sum($val);
$div = intval($suma / 11);
$num = $div * 11;
$resta = $suma - $num;
if ($resta == 1) {
return $resta;
} else {
return 11 - $resta;
}
} else {
return 'error, debe ser numero';
}
}
if ($resta == 1)
if ($resta <= 1)
public static int calculaDigitoVerificacion(String sNit) {
int result = 0;
int x = 0;
int y = 0;
char[] c = sNit.toCharArray();
int z = c.length;
if(sNit != null) {
if(!sNit.isEmpty()) {
int arr[] = new int[] {3,7,13,17,19,23,29,37,41,43,47,53,59,67,71};
int index = z-1;
for(int i = 0; i < z; i++) {
y = getInt(String.valueOf(c[i]));
x += (y * arr[index]);
index--;
}
y = x % 11;
result = ( y > 1 ) ? 11 - y : y ;
}
}
return result;
}
public static int getInt(String value) {
return getInteger(value, 0);
}
public static Integer getInteger(String value, int defaultValue) {
Integer result;
try {
result = Integer.valueOf(value);
} catch(Exception e) {
result = defaultValue;
}
return result;
}
CREATE DEFINER=`lucas`@`%` FUNCTION `Validar_Nit`(`tcNit` varchar(15)) RETURNS int(11)
BEGIN
#Declaramos e iniciamos las variables.
DECLARE lcDato, lcChar VARCHAR(15) DEFAULT '';
DECLARE lnItem, lnSuma, lnRetorno INT DEFAULT 0;
#Valor limpio del parametro pasado
SET lcDato := RIGHT(CONCAT(SPACE(15), TRIM(tcNit)), 15);
#Ciclo para calculos
REPEAT
SET lnItem := lnItem + 1;
SET lcChar := SUBSTR(lcDato FROM lnItem FOR 1);
SET lnSuma := lnSuma + (lcChar * ELT(lnItem, 71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3));
UNTIL lnItem = 15
END REPEAT;
#Calculo final para devolver el valor del digíto en número.
SET lnSuma := MOD(lnSuma, 11);
IF lnSuma = 0 OR lnSuma = 1 THEN
SET lnRetorno := lnSuma;
ELSE
SET lnRetorno := 11 - lnSuma;
END IF;
RETURN lnRetorno;
END