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 ;)
Para los nostálgicos como yo, y para la letra del DNI,
^Z("DNI")="S L=$S(DNI?1.8N:$E("TRWAGMYFPDXBNJZSQVHLCKE",(DNI-((DNI\23)*23))+1),1:"")"
Salud
Muchas gracias por la aportación. En una sola linea tienes la fórmula del DNI.
En este caso, también gestiona el NIE y se aprovecha la misma función. Por otro lado, soy mas partidiario del código mas amplio y legible, para tener un facil mantenimiento, e intentar evitar las contracciones de comandos.
Un saludo,
Francisco