Newsgroup: it.comp.lang.javascript
Titolo: CODICE FISCALE... vediamo chi ci riesce in meno righe!!

Io (purtroppo) ho il vizio di programmare senza commenti e "ZIPPANDO" il
tutto:
lo scriptino funziona dappertutto anche nei casi piu' disperati e
controlla la validita' dei campi nome e cognome:
###########################################
           UNICO FILE
###########################################
###########################################
<html><head>
<script>
function getChars(strNome,isNome) {
   noSpaces = (strNome.replace(/(\s|\')/g, "")).toUpperCase();
   v = noSpaces.match(/[(a|e|i|o|u)]/gi);
   c = noSpaces.match(/[^(a|e|i|o|u)]/gi);
   if ((isNome)&&(c.length>=4)) c=(c.slice(0,1)).concat(c.slice(2))
   out = "";
   if (c) for (var j=0;(j<c.length)&&(j<3);j++) out+=c[j];
   for (var j=0;j<v.length;j++) out+=v[j];
   return((out+"X").substring(0,3));
}
function makeData(form) {
   var
giorno=parseInt(form.giorno.selectedIndex)+1+40*form.sesso.selectedIndex;
   var mese=form.mese.selectedIndex;
   var anno=form.anno.value%100;
 
return(anno+""+"ABCDEHLMPRST".charAt(mese)+""+((giorno<10)?"0":"")+giorno);
}
function rRun(form) {
   if (!(check(form.nome)||check(form.cognome)))
      form.result.value=getChars(form.cognome.value,false) +
getChars(form.nome.value,true) + makeData(form);
   else
      alert("Ricontrolla i campi");
}
function check(campoForm) {
   var ret = "";
   if (campoForm.value.match(/[^a-z\'\s]/gi)) {
      alert("Controlla bene il campo "+campoForm.name);
	  ret+="false";
   }
   return ret;
}
</script>
</head>
<body>
<form name="formina">
Cognome: <input name="cognome" size=20 value="Romagnoli"
onChange="(check(this))"><BR>
Nome: <input name="nome" size=20 value="Michele"
onChange="check(this)"><BR>
Nato il: <SELECT NAME="giorno">
<SCRIPT LANGUAGE="JavaScript">
   for (var j=1;j<=31;j++)
      document.write("<OPTION"+((j==22)?" SELECTED":"")+">"+j);
</SCRIPT>
</SELECT>
<SELECT NAME="mese">
<SCRIPT LANGUAGE="JavaScript">
   for (var j=1;j<=12;j++)
      document.write("<OPTION"+((j==3)?" SELECTED":"")+">"+j);
</SCRIPT>
</SELECT>
<input name="anno" size=4 value="1976">
Sesso: <SELECT NAME="sesso">
<OPTION SELECTED>M
<OPTION>F
</SELECT><BR>
<input type=button onclick="rRun(document.formina)" value="Calcola">
<input name="result" size=16>
</form>
</body></html>
###########################################
###########################################
e' piu' lungo l'HTML del javascript!!
AH... NON ci sono i codici catastali e l'algoritmo per l'ultimo
carattere
Elementi di determinazione del carattere di controllo:
*** NON HO TEMPO NE VOGLIA PER FARLO ADESSO.... TRA UN PO' FORSE!!! ***
carattere	se carattere	se carattere	carattere
del		in posizione	in posizione	corrispondente
codice		pari		dispari		al resto
A		0		1		0 = A
B		1		0		1 = B
C		2		5		2 = C
D		3		7		3 = D
E		4		9		4 = E
F		5		13		5 = F
G		6		15		6 = G
H		7		17		7 = H
I		8		19		8 = I
J		9		21		9 = J
K		10		2		10 = K
L		11		4		11 = L
M		12		18		12 = M
N		13		20		13 = N
O		14		11		14 = O
P		15		3		15 = P
Q		16		6		16 = Q
R		17		8		17 = R
S		18		12		18 = S
T		19		14		19 = T
U		20		16		20 = U
V		21		10		21 = V
W		22		22		22 = W
X		23		25		23 = X
Y		24		24		24 = Y
Z		25		23		25 = Z
0		0		1
1		1		0
2		2		5
3		3		7
4		4		9
5		5		13
6		6		15
7		7		17
8		8		19
9		9		21
IL RESTO RISULTA DALLA DIVISIONE DEL TOTALE DEI VALORI DEI CARATTERI IN
POSIZIONE PARI + IL TOTALE DEI VALORI DEI CARATTERI IN POSIZIONE DISPARI
DIVISO PER 26.
Esempio: Rossi Claudio nato a Roma il 15/10/1950
		POSIZIONE	CARATTERE	VALORE		VALORE
		CARATTERE			(PARI)		(DISPARI)
COGNOME	1	R		---		8
COGNOME	2	S		18		---
COGNOME	3	S		---		12
NOME		4		C		2		---
NOME		5		L		---		4
NOME		6		D		3		---
NASCITA (A)	7		5		---		13
NASCITA (A)	8		0		0		---
NASCITA (M)	9		R		---		8
NASCITA (G)	10		1		1		---
NASCITA (G)	11		5		---		13
LUOGO		12		H		7		---
LUOGO		13		5		---		13
LUOGO		14		0		0		---
LUOGO		15		1		---		0
					TOTALE	31		71
31+71=102 ; Resto di 102 diviso 26 = 24 corrispondente a Y
CONTROLLO	16		Y		
beh.... buonanotte!!
-- 
ciao --
-- sdrushi
/-------------------------------------------\
| \     Michele "Sdrushi" Romagnoli       / |
|  \          ICQ: 39783579              /  |
|   \___________________________________/   |
|                                           |
| 
http://caristudenti.cs.unibo.it/~romagnom
 |
|       
sdr...@comune.budrio.bo.it
         |
|     
roma...@cs.unibo.it
 (forwarded)      |
\-------------------------------------------/

 carattere
ti peggioro il codice postando il controllo per l'ultimo
carattere
... mentre per i codici catastali ci sono già in fondo a
www.probo.it/Prove/codicefiscale.js
....direi che se uno ha tempo di assemblare il tutto
il codice è fatto...
di nuovo complimenti per lo script
function Codice_controllo(codice) {
 controlloc = Array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J',
  'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z' );
 controllop =
ay(  Array('0',0),Array('1',1),Array( '2',2),Array( '3',3),A
rray( '4',4),Array( '5',5),Array( '6',6),Array( '7',7),Array
( '8',8),Array( '9',9),
ray('A',0),Array('B',1),Array( 'C',2),Array( 'D',3),Array( '
E',4),Array( 'F',5),Array( 'G',6),Array( 'H',7),Array( 'I',8
),Array( 'J',9),
ay('K',10),Array( 'L',11),Array( 'M',12),Array( 'N',13),Arra
y( 'O',14),Array( 'P',15),Array( 'Q',16),Array( 'R',17),Arra
y( 'S',18),Array( 'T',19),Array( 'U',20),
y( 'V',21),Array( 'W',22),Array( 'X',23),Array( 'Y',24),Arra
y( 'Z',25) );
 controllod =
ay(  Array('0',1),Array('1',0),Array( '2',5),Array( '3',7),A
rray( '4',9),Array( '5',13),Array( '6',15),Array( '7',17),Ar
ray( '8',19),Array( '9',21),
ray('A',1),Array('B',0),Array( 'C',5),Array( 'D',7),Array( '
E',9),Array( 'F',13),Array( 'G',15),Array( 'H',17),Array( 'I
',19),Array( 'J',21),
ay('K',2),Array( 'L',4),Array( 'M',18),Array( 'N',20),Array(
11),Array( 'P',3),Array( 'Q',6),Array( 'R',8),Array( 'S',12)
,Array( 'T',14),Array( 'U',16),
y( 'V',10),Array( 'W',22),Array( 'X',25),Array( 'Y',24),Arra
y( 'Z',23) );
    somma = 0;
    for (int i=0; i<codice.length; i++) {
      if (((i+1) % 2) != 0) {
 for (x=0; x<controllop.length;
x++)if(controllod[x][0]==codice.charAt(i).toUpperCase())brea
k;
        somma += controllod[x][1];
      } else {
 for (x=0; x<controllop.length;
x++)if(controllop[x][0]==codice.charAt(i).toUppercase())brea
k;
        somma += controllop[x][1];
      }
    }
 return   controllo = controlloc[somma % 26];
}
--
Bye
Ro<*¿*>berto

,,,,, lo incollo meglio.... č da controllare, l'ho scritto
senza provarlo!!
function Codice_controllo(codice) {
 controlloc = Array( 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J',  'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' );
 controllop =
ay(  Array('0',0),Array('1',1),Array( '2',2),
Array( '3',3),Array( '4',4),Array( '5',5),Array( '6',6),
Array( '7',7),Array( '8',8),Array( '9',9), Array('A',0),
Array('B',1),Array( 'C',2),Array( 'D',3),Array( 'E',4),
Array( 'F',5),Array( 'G',6),Array( 'H',7),Array( 'I',8),
Array( 'J',9),  Array('K',10),Array( 'L',11),Array( 'M',12),
Array( 'N',13),Array( 'O',14),Array( 'P',15),Array( 'Q',16),
Array( 'R',17),Array( 'S',18),Array( 'T',19),Array( 'U',20),
Array( 'V',21),Array( 'W',22),Array( 'X',23),Array( 'Y',24),
Array( 'Z',25) );
 controllod =
ay(  Array('0',1),Array('1',0),Array( '2',5),
Array( '3',7),Array( '4',9),Array( '5',13),Array( '6',15),
Array( '7',17),Array( '8',19),Array( '9',21), Array('A',1),
Array('B',0),Array( 'C',5),Array( 'D',7),Array( 'E',9),
Array( 'F',13),Array( 'G',15),Array( 'H',17),Array( 'I',19),
Array( 'J',21), Array('K',2),Array( 'L',4),Array( 'M',18),
Array( 'N',20),Array( 'O',11),Array( 'P',3),Array( 'Q',6),
Array( 'R',8),Array( 'S',12),Array( 'T',14),Array( 'U',16),
Array( 'V',10),Array( 'W',22),Array( 'X',25),Array( 'Y',24),
Array( 'Z',23) );
    somma = 0;
    for (int i=0; i<codice.length-1; i++) {
      if (((i+1) % 2) != 0) {
 for (x=0; x<controllop.length; x++)
if(controllod[x][0]==codice.charAt(i).toUpperCase())break;
        somma += controllod[x][1];
      } else {
 for (x=0; x<controllop.length; x++)
if(controllop[x][0]==codice.charAt(i).toUppercase())break;
        somma += controllop[x][1];
      }
    }
 return   controlloc[somma % 26];
}
--
Bye
Ro<*ż*>berto

 senza provarlo!!
OK.... accetto l'invito..... stasera (verso le 6) ci gurdo e posto !!
prima non posso (devo finire un motore di ricerca in CGI, un MIDI to XML
da visualizzare con un JavaBean e un Parser per Pascal scritto in OCaml
entro meta' giugno....)
fan**lo a sti progetti assurdi!! molto meglio il codice fiscale ;-)


 fan**lo a sti progetti assurdi!! molto meglio il codice
fiscale ;-)
Concordo..........eWiva il Codice Fiscale!!!! ;-)
Aggiungerei... e le BioPagine!
:)
--
Bye
Ro<*¿*>berto
PS: Se pensi che qualcuno
ti possa aiutare, chiedi ... fino ad
ora hai solo dato in questo NG.

>>>>>vediamo chi ci riesce in meno righe!!
Beh? Potevi dirlo che volevi fare una gara, no? :-(
Comunque hai fatto uno script bellissimo! Complimenti davvero!
Non conoscevo le funzioni match() e replace(). Che belle che sono! :-)
Ciao.
Darius. (
www.infotronica.it/darius/
)

>Beh? Potevi dirlo che volevi fare una gara, no? :-(
.:)...non te la prendere, direi uno pari, tu hai fatto il
miglior
cronometro!!
... alla prossima partecipo anch'io....
..ma che si vince???:)



come hai detto ?? prosciutti e mortadelle ??
cavolo mi impegno allora !! ;-)


 cavolo mi impegno allora !! ;-)
noi non siamo lontani, (BOLOGNA), una pizza ce la possiamo
giocare, è che se vince Darius (TORINO) ci roviniamo con la
spesa del viaggio..;)
cmq. anche per una bella pizza virtuale, ci si può
impegnare..:)


 impegnare..:)
volentieri!!!


controlla la validita' dei campi nome e cognome:
vero... con il mio cognome funziona! lo script postato da Darius
faceva un po' di casino per la scelta della vocale
ciao
-- 
____________________________________
Blow Your Speaker with Rock 'n' Roll
http://members.xoom.com/terzai
(ora diventata IV i)
...tatatatatata Heavy Metal - Bart Simpson

queste caratteristiche
...naturalmente possono e devono partecipare tutti
quelli del NG.
alla prox.
