1
Aprender a programar desde cero / Re:Captura por teclado sin crear una variable
« en: 09 de Febrero 2017, 21:18 »
Bueno, así he dejado finalmente la clase Alumno comprobando todas los formatos de NIF/NIE:
Código: [Seleccionar]
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Alumno
{
private String nif;
private String nombre;
private String apellidos;
private String direccion;
private String poblacion;
private String matricula;
public Alumno (String valorNif, String valorNombre, String valorApellidos, String valorDireccion, String valorPoblacion, String valorMatricula){
nif=valorNif;
nombre=valorNombre;
apellidos=valorApellidos;
direccion=valorDireccion;
poblacion=valorPoblacion;
matricula=valorMatricula;
}
public void setNif(String nif){
if (validarNif(nif) == true){
this.nif=nif;
} else {
this.nif="INVALIDO";
}
}
public String getNif(){
return this.nif;
}
public void setNombre(String nombre){
this.nombre=nombre;
}
public String getNombre(){
return this.nombre;
}
public void setApellidos(String apellidos){
this.apellidos=apellidos;
}
public String getApellidos(){
return this.apellidos;
}
public void setDireccion(String direccion){
this.direccion=direccion;
}
public String getDireccion(){
return this.direccion;
}
public void setPoblacion(String poblacion){
this.poblacion=poblacion;
}
public String getPoblacion(){
return this.poblacion;
}
public void setMatricula(String matricula){
this.matricula=matricula;
}
public String getMatricula(){
return this.matricula;
}
public Alumno () {}
public boolean validarNif (String nif){
Pattern patEstandar = Pattern.compile("\\d{8}[A-Z]"); // Expresión regular para el formato estándar.
Matcher nifEstandar = patEstandar.matcher(nif);
Pattern patNie = Pattern.compile("[XYZ]\\d{7}[A-Z]"); // Expresión regular para el NIE.
Matcher nifNie = patNie.matcher(nif);
// Mediante expresiones regulares acotamos los dos formatos de entrada admitidos.
String caracteres = "TRWAGMYFPDXBNJZSQVHLCKE";
boolean esValido = false;
if (nifEstandar.matches()){ // Si el NIF tiene un formato estandar...
if (caracteres.charAt(Integer.parseInt(nif.substring(0, 8)) % 23) == nif.charAt(8))
/*
* 1. Se convierte a entero la parte del NIF correspondiente al número.
* 2. Se divide ésta entre 23. Se toma el resto de la division.
* 3. Se comprueba qué letra de la cadena "caracteres" se encuentra en la posición correspondiente al resto.
* 4. Se compara ésta con la que ha introducido el usuario.
*/
{esValido = true;} else {System.out.println("La letra del NIF no es correcta. Intentalo otra vez.");}
// En caso de que ambas sean iguales, se valida el booleano; en caso contrario, se informa del error.
} else if (nifNie.matches()){ // Si resulta tener el formato de un NIE...
switch(nif.charAt(0)){ // En función de la letra inicial (X, Y o Z) se continúa por un itinerario u otro.
case 'X':
if (caracteres.charAt(Integer.parseInt(nif.substring(1, 8)) % 23) == nif.charAt(8)){
esValido = true;} else {System.out.println("La letra del NIF no es correcta. Intentalo otra vez.");}
// En este caso, el proceso a seguir es el mismo que para el NIF, excepto que se desecha la X inicial.
break;
case 'Y': // Si comienza por Y...
nif = nif.replace('Y', '1'); // Se sustituye la Y por un 1 y se sigue el proceso ya indicado.
if (caracteres.charAt(Integer.parseInt(nif.substring(0, 8)) % 23) == nif.charAt(8)){
esValido = true;} else {System.out.println("La letra del NIF no es correcta. Intentalo otra vez.");}
break;
case 'Z': // Si comienza por Z...
nif = nif.replace('Z', '2'); // Se sustituye la Z por un 2 y continúa el proceso ya indicado.
if(caracteres.charAt(Integer.parseInt(nif.substring(0, 8)) % 23) == nif.charAt(8)){
esValido = true;} else {System.out.println("La letra del NIF no es correcta. Intentalo otra vez.");}
break;
}
} else { // Si no coincide con ninguno de los dos formatos...
System.out.println("El formato de este NIF/NIE no es valido.");} // Se imprime un aviso de error
return esValido; // Se retorna el valor de la variable booleana
}
}