Tema: validar Cif
Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/11/2010, 05:50
jlgarcia1977
 
Fecha de Ingreso: octubre-2008
Ubicación: Madrid
Mensajes: 352
Antigüedad: 15 años, 7 meses
Puntos: 5
validar Cif

Tengo un algoritmo para validar cif, que esta cogido de intenet, pero por ejemplo con el cif: A4001076A que si es valido no me lo coje.

A ver si alguien tiene otro algoritmo.

yo tengo:

public static boolean validarCIF(String cif) {

cif=cif.trim().toUpperCase();

final Pattern cifPattern = Pattern.compile("[[A-H][J-N][P-S]UVW][0-9]{7}[0-9A-J]");
final String CONTROL_SOLO_NUMEROS = "ABEH"; // Sólo admiten números como caracter de control
final String CONTROL_SOLO_LETRAS = "KPQS"; // Sólo admiten letras como caracter de control
final String CONTROL_NUMERO_A_LETRA = "JABCDEFGHI"; // Conversión de dígito a letra de control.

try {
if (!cifPattern.matcher(cif).matches()) {
// No cumple el patrón
return false;
}

int parA = 0;
for (int i = 2; i < 8; i += 2) {
final int digito = Character.digit(cif.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(cif.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 = cif.charAt(0);
final char caracterFin = cif.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;
}

}