Advertisement
Guest User

CodiceFiscale.java

a guest
Mar 1st, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.82 KB | None | 0 0
  1. package inputCodFisc;
  2.  
  3. public class CodiceFiscale {
  4.     private static char[] mapMese = "ABCDEHLMPRST".toCharArray();
  5.     private static char[] vocali = "aeiou".toCharArray();
  6.     private static char[] mapPari="ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  7.     private static char[] alfabeto=mapPari;
  8.     private static char[] mapDisp ="BAKPLCQDREVOSFTGUHMINJWZYX".toCharArray();
  9.     private static String[] mapComuniA= {"roma","rimini","bologna"};
  10.     private static String[] mapComuniB= {"H501","H294","A994"};
  11.    
  12.  
  13.     public static String generaCodiceFiscale(String[] args) {
  14.         String nome,cognome,sesso,data,comune;
  15.        
  16.         //suddivido i parametri
  17.         cognome=args[0];
  18.         nome=args[1];
  19.         data=args[2];
  20.         sesso=args[3];
  21.         comune=args[4];
  22.        
  23.         String tempCF;
  24.         tempCF= (getCognome(cognome)+
  25.                 getNome(nome)+
  26.                 getData(data,sesso)+
  27.                 getComune(comune)).toUpperCase();
  28.        
  29.         tempCF+=getCtrl(tempCF);
  30.        
  31.         return tempCF;
  32.     }
  33.  
  34.     //metodo per recuperare le lettere corrispondenti al cognome
  35.     //per comodità creo una stringa con tutte le consonanti, tutte le vocali, 3 "x" finali
  36.     //e restistuisco le prime 3 lettere della stringa
  37.     private static String getCognome(String cognome) {
  38.         String temp="";
  39.        
  40.         //prendo le consonanti
  41.         temp+=getLettere(cognome,'c');
  42.        
  43.         //prendo le vocali
  44.         temp+=getLettere(cognome,'v');
  45.        
  46.         //aggiungo le "x"
  47.         temp+="xxx";
  48.        
  49.         //restituisco le prime 3 lettere
  50.         return temp.substring(0,3);
  51.     }
  52.    
  53.     //metodo per recuperare le lettere corrispondenti al nome
  54.     //se riesco a recuperare 4 consonanti restituisco quelle corrette altrimenti
  55.     //procedo come con il cognome
  56.     private static String getNome(String nome) {
  57.         String temp="";
  58.        
  59.         //prendo le consonanti
  60.         temp+=getLettere(nome,'c');
  61.        
  62.         //restituisco le lettere se ho abbastanza consonanti
  63.         if(temp.length()>=4){
  64.             return ""+temp.charAt(0)+temp.charAt(2)+temp.charAt(3);
  65.         }
  66.        
  67.         //prendo le vocali
  68.         temp+=getLettere(nome,'v');
  69.        
  70.         //aggiungo le "x"
  71.         temp+="xxx";
  72.        
  73.         //restituisco le prime 3 lettere
  74.         return temp.substring(0,3);
  75.     }
  76.    
  77.     //metodo per recuperare le lettere corrispondenti alla data di nascita
  78.     //secondo il formato giorno/mese/anno, con controlla la correttezza della data
  79.     private static String getData(String data, String sesso){
  80.         String temp="";
  81.         //suddivido la data per giorno/mese/ann0
  82.         String[] gma= data.split("/");
  83.         //ottengo il giorno (calcolando se è femmina) e il mese in formato numerico
  84.         int giorno=Integer.parseInt(gma[0]);
  85.         if(sesso.equals("f")) giorno+=40;
  86.        
  87.         int mese=Integer.parseInt(gma[1]);
  88.        
  89.         temp+=  gma[2].substring(2)+    //le ultime 2 cifre dell'anno
  90.                 mapMese[mese-1]+        //lettera corrispondente al mese (indice diminuito di 1 perchè i mesi iniziano da 1 invece che 0)
  91.                 giorno;                 //il giorno, già calcolato se femmina
  92.        
  93.         return temp;
  94.     }
  95.    
  96.     //metodo per recuperare le lettere corrispondenti al comune
  97.     //effettuo il controllo solo per i comuni indicati come esempio nelle slide
  98.     private static String getComune(String comune){
  99.         for(int i=0;i<mapComuniA.length;i++){
  100.             if(comune.equals(mapComuniA[i])){
  101.                 return mapComuniB[i];
  102.             }
  103.         }
  104.         System.out.println("Il comune inserito non è valido");
  105.         System.exit(1);
  106.         return null; //non ci arriva mai ma se non lo metto non compila
  107.     }
  108.    
  109.    
  110.     //metodo per la lettera di controllo
  111.     private static char getCtrl(String tempCF){
  112.         //sostituisco le cifre
  113.         String primaPassata="";
  114.         char current;
  115.         int k;
  116.         for(int i=0;i<tempCF.length();i++){
  117.             current=tempCF.charAt(i);
  118.             if(Character.isDigit(current)){
  119.                 k=Character.getNumericValue(current);
  120.                 primaPassata+=alfabeto[k];
  121.                 continue;
  122.             }
  123.             primaPassata+=current;
  124.         }
  125.  
  126.         //calcolo le cifre e sommo
  127.         int secondaPassata=0;
  128.         for(int i=0;i<primaPassata.length();i++){
  129.             //le lettere "dispari" trovano in posizioni "pari"
  130.             if((i%2)==0){
  131.                 secondaPassata+=getNumero(primaPassata.charAt(i),'d');
  132.             }else{
  133.                 secondaPassata+=getNumero(primaPassata.charAt(i),'p');
  134.             }
  135.         }
  136.        
  137.         //numero della lettera di controllo
  138.         int numero=secondaPassata%26;
  139.        
  140.         //lettera corrispondente
  141.         return alfabeto[numero];
  142.     }
  143.    
  144.     //metodo per stabilire se è una vocale
  145.     private static boolean isVocale(char c){
  146.         for(int i=0;i<vocali.length;i++){
  147.             if(c==vocali[i]) return true;
  148.         }
  149.         return false;
  150.     }
  151.    
  152.     //metodo per recuperare vocali e consonanti da una stringa
  153.     private static String getLettere(String in, char op){
  154.         String temp="";
  155.         char current;
  156.         for(int i=0;i<in.length();i++){
  157.             current=in.charAt(i);
  158.             if(!isVocale(current)&&(op=='c')) temp+=current;
  159.             if(isVocale(current)&&(op=='v')) temp+=current;
  160.         }
  161.         return temp;
  162.     }
  163.  
  164.     //metodo per recuperare il valore della lettera
  165.     private static int getNumero(char in, char op){
  166.         char[] map=(op=='p')?mapPari:mapDisp;
  167.         for(int i=0;i<map.length;i++){
  168.             if(in==map[i]) return i;
  169.         }
  170.        
  171.         return 0;
  172.     }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement