Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CALCULAR LETRA NIF

53 views
Skip to first unread message

Miguel Angel Sobrino Lozano

unread,
May 16, 1998, 3:00:00 AM5/16/98
to

HOLA DESEARIA LOCALIZAR EL CODIGO PARA HACER UNA FUNCION QUE ME CALCULE EL
DIGITO DE CONTROL DE UNOS DATOS BANCARIOS.
EJEMPLO
BANCO SUCURSAL D.C CUENTA CORRIENTE
0182 0966 ** 1234567890
Necesito saber cual es la formula que me calcule el Digito de Control de
unos datos bacarios.
BUENO A CAMBIO OS OFRECO ES TA FUNCION QUE CALCULA LA LETRA DE UN DNI.
'***************************************************************************
*****
'*
*
'* Función: sCalculaNif
*
'*
*
'* Creada por: Miguel Angel Sobrino Lozano
*
'*
*
'*
*
'* Parámetros: vDNI - Cadena de texto con el número del DNI
*
'*
*
'* Comentarios: Calcula la letra de NIF para un DNI
*
'*
*
'***************************************************************************
*****
'
Private Function sCalculaNif(vDNI) As String
On Error GoTo xg_CalculaNif_ERROR
'Declaración de las variables
Dim ld_DNIIntro As Double
Dim ld_DNICociente As Double
Dim ld_DNIMul As Double
Dim ld_DNIResto As Double
Dim ls_Letra As String
Dim li_Constante As Integer
li_Constante = 23
ld_DNIIntro = vDNI
If ld_DNIIntro <= 0 Or ld_DNIIntro > 99999999 Then
Error 11
Exit Function
End If
'Primera operación matemética. Divido el número de DNI
'por 23 que son el número de letras a utilizar y quito
'cualquier decimal
ld_DNICociente = Fix(ld_DNIIntro / li_Constante)
'Segunda operación matemática. Multiplico el resultado
'anterior sin decimales por el mismo número
ld_DNIMul = ld_DNICociente * li_Constante
'Tercera operación matemática. Resto del número de DNI
'el resultado de la operación anterior
ld_DNIResto = ld_DNIIntro - ld_DNIMul
'Asigno al resultado la letra correspondiente
Select Case ld_DNIResto
Case 0
ls_Letra = "T"
Case 1
ls_Letra = "R"
Case 2
ls_Letra = "W"
Case 3
ls_Letra = "A"
Case 4
ls_Letra = "G"
Case 5
ls_Letra = "M"
Case 6
ls_Letra = "Y"
Case 7
ls_Letra = "F"
Case 8
ls_Letra = "P"
Case 9
ls_Letra = "D"
Case 10
ls_Letra = "X"
Case 11
ls_Letra = "B"
Case 12
ls_Letra = "N"
Case 13
ls_Letra = "J"
Case 14
ls_Letra = "Z"
Case 15
ls_Letra = "S"
Case 16
ls_Letra = "Q"
Case 17
ls_Letra = "V"
Case 18
ls_Letra = "H"
Case 19
ls_Letra = "L"
Case 20
ls_Letra = "C"
Case 21
ls_Letra = "K"
Case 22
ls_Letra = "E"
'Si se produce otro resultado distinto de los anteriores
'sería erróneo por lo que generamos un error
Case Else
Error 11
End Select
'Preparamos la devolución de la Función y terminamos
sCalculaNif = ls_Letra
Exit Function
'Tratamiento de errores
xg_CalculaNif_ERROR:
sCalculaNif = ""
Exit Function
End Function

Guillermo 'guille'

unread,
May 17, 1998, 3:00:00 AM5/17/98
to

Hola,


En mis páginas, sección colaboradores, tienes lo que buscas.
(la página que te mostrará al entrar en esa sección es la nueva, linka con
la anterior)


Nos vemos.
Guillermo

--
==================================================
Te invito a visitar mis páginas sobre Visual Basic
http://guille.costasol.net/
==================================================

Miguel Angel Sobrino Lozano escribió en mensaje
<6jktg8$84q$1...@talia.mad.ibernet.es>...

Alex Lopez

unread,
May 19, 1998, 3:00:00 AM5/19/98
to

Miguel Angel Sobrino Lozano escribió en mensaje
<6jktg8$84q$1...@talia.mad.ibernet.es>...

>BUENO A CAMBIO OS OFRECO ES TA FUNCION QUE CALCULA LA LETRA DE UN DNI.

Y no sería más fácil de la siguiente manera:

Teniendo en cuenta que el DNI lo tenemos en una variable y ya sabemos que es
un número, hacemos el MODulo a 23, y después, teniendo una variable tipo
string con todas las letras la posición que indique su valor, tan solo
tenemos que hacer un MID de esa cadena con el resultado del MODulo.

Bueno, lo importante es hacerlo, pero espero que te ayude a tenerlo más
claro en cualquier lenguaje.

Saludos,

Alex López

Epari

unread,
May 19, 1998, 3:00:00 AM5/19/98
to

Antes de nada saludos al grupo. Acabo de empezar con el VB y espero
ponerme pronto a un buen nivel.

Lo que propone Miguel es algo así:

' Calcula la letra del nif a partir del dni
Function nif(dni As Long) As String
nif = Mid("TRWAGMYFPDXBNJZSQVHLCKE", dni Mod 23 + 1, 1)
End Function

En C todavía es más directo:

char nif(long dni)
{
return "TRWAGMYFPDXBNJZSQVHLCKE"[dni%23];
}

De todos modos el formato del NIF es más complejo, puesto que a parte de
personas físicas están las personas jurídicas. La documentación del
algoritmo se puede conseguir del Ministerio de Hacienda.

Estoy pasando algunas rutinas que tenía hechas en clipper al Visual
Basic. Entre otras cosas: chequeo del nif, cálculo del código de control
de cuentas bancarias, y una rutina para expresar literalmente un número
(muy útil en documentos contables).

A quien le interese estas rutinas las puede pillar de:
<http://epari.home.ml.org/rutinas/> en Visual Basic y Clipper.

Salu2,


--
<ep...@mackeros.com> ICQ-UIN-5443987 ____ ___ __ ___ __
<http://epari.home.ml.org> \\_ ||_\ //_\ ||_\ ||
Public PGP key available at PGP servers //__ || || | || \ ||

Elier Llueca

unread,
May 29, 1998, 3:00:00 AM5/29/98
to

Lo del dígito de control lo tienes chupao. Aplica la siguiente función:
Public Function CalculaDigitoControl(Entidad As String, Sucursal As String,
Cuenta As String) As String
Dim CadEntidadSucursal As String
Dim CadenaInversa As String
Dim i As Integer
Dim x(0 To 9) As Integer
Dim numMid As Integer
Dim numInt As Integer

'rellena la matriz
x(0) = 6
x(1) = 3
x(2) = 7
x(3) = 9
x(4) = 10
x(5) = 5
x(6) = 8
x(7) = 4
x(8) = 2
x(9) = 1

'Calcula el primer dídito

If Len(Entidad) < 4 Then
Entidad = String(4 - Len(Entidad), "0") & Entidad
End If
If Len(Sucursal) < 4 Then
Sucursal = String(4 - Len(Sucursal), "0") & Sucursal
End If
CadEntidadSucursal = Entidad & Sucursal

'invertir la cadena de entidad + sucursal
CadenaInversa = ""
For i = 0 To Len(CadEntidadSucursal) - 1
CadenaInversa = CadenaInversa & Mid(CadEntidadSucursal,
Len(CadEntidadSucursal) - i, 1)
Next i

numInt = 0
For i = 0 To Len(CadenaInversa) - 1
numMid = Val(Mid(CadenaInversa, i + 1, 1))
numInt = numInt + numMid * x(i)
Next i
numInt = (11 - (numInt Mod 11))
'casos particulares
If numInt = 10 Then numInt = 1
If numInt = 11 Then numInt = 0
'este es el primer dígito
CalculaDigitoControl = Trim(Str(numInt))

'calcula el segundo dígito
If Len(Cuenta) < 10 Then
Cuenta = String(10 - Len(Cuenta), "0") & Cuenta
End If

'invertir la cadena de Cuenta
CadenaInversa = ""
For i = 0 To Len(Cuenta) - 1
CadenaInversa = CadenaInversa & Mid(Cuenta, Len(Cuenta) - i, 1)
Next i
numInt = 0
For i = 0 To Len(CadenaInversa) - 1
numMid = Val(Mid(CadenaInversa, i + 1, 1))
numInt = numInt + numMid * x(i)
Next i
numInt = (11 - (numInt Mod 11))
'casos particulares
If numInt = 10 Then numInt = 1
If numInt = 11 Then numInt = 0
'este es el segundo dígito
CalculaDigitoControl = CalculaDigitoControl & Trim(Str(numInt))

End Function

Espero que te sirva. Saludos. Elier
elie...@colon.net


Miguel Angel Sobrino Lozano escribió en mensaje
<6jktg8$84q$1...@talia.mad.ibernet.es>...

0 new messages