Se encuentra en:
Algoritmo de validación de NIF distinto al DNI
RECU-0679 (Recurso Ejemplo)
- Área: Prototipos de manipulación de datos
- Carácter del recurso: Recomendado
- Tecnologías: Java
Descripción
Para validar un NIF distinto al DNI, se debe seguir el algoritmo Java que se muestra a continuación.
Ejemplos
private static final Pattern cifPattern = Pattern.compile("[[A-H][J-N][P-S]UVW][0-9]{7}[0-9A-J]");
private static final String CONTROL_SOLO_NUMEROS = "ABEH"; // Sólo admiten números como caracter de control
private static final String CONTROL_SOLO_LETRAS = "KPQS"; // Sólo admiten letras como caracter de control
private static final String CONTROL_NUMERO_A_LETRA = "JABCDEFGHI"; // Conversión de dígito a letra de control.
public static boolean validarNif7Digitos(String nif) {
try {
if (!cifPattern.matcher(nif).matches()) {
// No cumple el patrón
return false;
}
int parA = 0;
for (int i = 2; i < 8; i += 2) {
final int digito = Character.digit(nif.charAt(i), 10);
if (digito < 0) {
return false;
}
parA += digito;
}
int nonB = 0;
for (int i = 1; i < 9; i += 2) {
final int digito = Character.digit(nif.charAt(i), 10);
if (digito < 0) {
return false;
}
int nn = 2 * digito;
if (nn > 9) {
nn = 1 + (nn - 10);
}
nonB += nn;
}
final int parcialC = parA + nonB;
final int digitoE = parcialC % 10;
final int digitoD = (digitoE > 0) ? (10 - digitoE) : 0;
final char letraIni = nif.charAt(0);
final char caracterFin = nif.charAt(8);
final boolean esControlValido =
// ¿el caracter de control es válido como letra?
(CONTROL_SOLO_NUMEROS.indexOf(letraIni) < 0 && CONTROL_NUMERO_A_LETRA.charAt(digitoD) == caracterFin)
||
// ¿el caracter de control es válido como dígito?
(CONTROL_SOLO_LETRAS.indexOf(letraIni) < 0 && digitoD == Character.digit(caracterFin, 10));
return esControlValido;
} catch (Exception e) {
return false;
}
}
Contenidos relacionados
Pautas
Código | Título | Tipo | Carácter | |
---|---|---|---|---|
LIBP-0196 | NIF | Libro de pautas | Directriz | Obligatoria |