Funciones útiles para DNI
Hola a todos:
En este artículo quiero compartir unas funciones con vosotros, que espero os sean útiles en algún momento.
Definiciones
DNI: Documento Nacional de Identidad. Se compone de diferentes series de números y letras, que acreditan la identidad y los datos personales del titular, así como la nacionalidad española. Ejemplo: 94494452X
NIE: Número de Identificación Extranjero: Es un código para extranjeros en España.
Si necesitas generar ejemplos, puedes generar ejemplos de DNI o NIE en el siguiente enlace:
Cálculo de letra de un número DNI
La primera función calcula la letra de un número DNI.
/// Calculate letter of DNI
/// <br><b>pDni</b> format: con 8 numbers
ClassMethod GetLetterDni(pDni As %String) As %String
{
set correspondence = $LISTBUILD("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E")
set letter = ""
if (pDni '= "") & ($GET(pDni)?8N){
set num = (pDni # 23)+1
set letter = $LISTGET(correspondence,num)
}
quit letter
}
Cálculo de letra de un número NIE
La segunda función calcula una letra de NIE usando la primera función.
/// Calculate letter of NIE
/// <br><b>pNie</b> format: 1 letter, 7 numbers
ClassMethod GetLetterNie(pNie As %String) As %String
{
set letter = ""
//Get the first value
set letter1 = $ZCONVERT($EXTRACT(pNie,1,1),"U")
//Cogemos el resto del Nie para su posterior uso
set num = $EXTRACT(pNie,2,8)
if (pNie '= "") & ($GET(pNie)?1U7N){
//If NIE starts with X, the X is replaced by the 0
if (letter1 = "X") { set dni = 0_num }
//If NIE starts with Y, the Y is replaced by the 1
elseif(letter1 = "Y") { set dni = 1_num }
//If NIE starts with Z, the Z is replaced by the 2
elseif (letter1 = "Z"){ set dni = 2_num }
//Calculates the letter
set letter = ..GetLetterDni(dni)
}
quit letter
}
Validación de un DNI
La tercera función valida un DNI usando la primera función.
/// <br><b>pDni</b> format: 8 numbers, 1 letter
/// <br><b>0</b> Dni OK
/// <br><b>-1</b> Dni error
ClassMethod ValidateDni(pDni As %String) As %Integer
{
set response = -1
if (pDni '= "") & ($GET(pDni)?8N1U){
//Get the numbers
set auxNum = $EXTRACT(pDni,1,8)
//Get the letter
set auxLetter = $EXTRACT(pDni,9,9)
//Calculates letter of dni
set calculatedLetter = ..GetLetterDni(auxNum)
//If both letters are the same the DNI is valid
if (auxLetter = calculatedLetter) { set response = 0 }
}
quit response
}
Validación de un NIE
La última función valida un NIE utilizando la segunda función.
/// <br><b>pNie</b> NIE format: 1 letter, 7 numbers, 1 letter
/// <br><b>0</b> NIE OK
/// <br><b>-1</b> NIE error
ClassMethod ValidateNie(pNie As %String) As %Integer
{
set response = -1
if (pNie '= "") & ($GET(pNie)?1U7N1U){
//Get the "numbers"
set auxNum = $EXTRACT(pNie,1,8)
//Get the first letter
set auxLetter = $EXTRACT(pNie,9,9)
set calculatedLetter = ..GetLetterNie(auxNum)
//Si ambas letras son iguales el DNI es valido
if (auxLetter = calculatedLetter) { set response = 0 }
}
quit response
}
Cualquier comentario para mejorar será bienvenido!!!
Saludos ;)