# Controllo codice fiscale

**URL:** <https://www.ruby-forum.com/t/controllo-codice-fiscale/97481>\
**Category:** IT\
**Created:** [July 7, 2006, 11:54am UTC](https://www.ruby-forum.com/t/controllo-codice-fiscale/97481 "2006-07-07T11:54:49Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![stefsava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@stefsava](https://www.ruby-forum.com/u/stefsava)\
**Post date:** [July 7, 2006, 11:54am UTC](https://www.ruby-forum.com/t/controllo-codice-fiscale/97481/1 "2006-07-07T11:54:49Z")

</div>

Sono un niubbo in ruby, che ne pensate della routine che ho scritto ?

Rispecchia lo spirito del linguaggio?

def check\_codice\_fiscale codice  
return false if codice.size != 16  
pari = “ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”  
dispari=“BAKPLCQDREVOSFTGUHMINJWZYX10KPL2Q3R4VOS5T6U7M8N9WZYX”  
codice = codice.upcase  
s=0  
15.times{|x| s += ((x & 1 != 0) ? pari : dispari).rindex(codice[x,1])  
}  
pari[(s % 26),1] == codice[15,1]  
end

A mio giudizio forse il codice sarÃ migliorabile,

ma il linguaggio e’ incredibilmente fantastico!

Stefano

---

<div class="post-metadata">

**Author:** ![stefsava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@stefsava](https://www.ruby-forum.com/u/stefsava)\
**Post date:** [July 7, 2006, 12:07pm UTC](https://www.ruby-forum.com/t/controllo-codice-fiscale/97481/2 "2006-07-07T12:07:25Z")

</div>

Il giorno 07/lug/06, alle ore 11:54, stefano sa ha scritto:

> Sono un niubbo in ruby, che ne pensate della routine che ho scritto ?

Che è molto più agile della mia ☹

In compenso ho una bella verifica della partita IVA

def partita\_iva?  
if (size == 11)  
s = ((0…4).map {|i| self[i \* 2, 1].to\_i}).inject {|x, y| x + y}  
s += ((0…4).map {|i| (self[i \* 2 + 1, 1].to\_i \* 2) % 9}).inject  
{|x, y| x + y}  
(s % 10) == 0 ? 0 : 10 - (s % 10) == self[10,1].to\_i  
else  
false  
end  
end

Questa invece è la mia sciagurata verifica del codice fiscale:

def codice\_fiscale?  
if(size == 16)  
tbl = {“0” =\> 1, “1” =\> 0, “2” =\> 5, “3” =\> 7, “4” =\> 9, “5” =\>  
13, “6” =\> 15, “7” =\> 17, “8” =\> 19, “9” =\> 21,  
“A” =\> 1, “B” =\> 0, “C” =\> 5, “D” =\> 7, “E” =\> 9, “F” =\>  
13, “G” =\> 15, “H” =\> 17, “I” =\> 19, “J” =\> 21,  
“K” =\> 2, “L” =\> 4, “M” =\> 18, “N” =\> 20, “O” =\> 11, “P”  
=\> 3, “Q” =\> 6, “R” =\> 8, “S” =\> 12, “T” =\> 14,  
“U” =\> 16, “V” =\> 10, “W” =\> 22, “X” =\> 25, “Y” =\> 24,  
“Z” =\> 23}  
s = ((0…7).map {|i| tbl[self[i \* 2, 1]]}).inject {|x, y| x + y}  
s+= ((0…6).map do |i|  
if self[i \* 2 + 1, 1].to\_i.to\_s == self[i \* 2 + 1, 1]  
self[i \* 2 + 1, 1].to\_i  
else  
self[i \* 2 + 1] - “A”[0]  
end  
end  
).inject {|x, y| x + y}  
(s % 26 + “A”[0]) == self[15]  
else  
false  
end  
end

---

<div class="post-metadata">

**Author:** ![stefsava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@stefsava](https://www.ruby-forum.com/u/stefsava)\
**Post date:** [July 7, 2006, 12:10pm UTC](https://www.ruby-forum.com/t/controllo-codice-fiscale/97481/3 "2006-07-07T12:10:27Z")

</div>

c’è la parte dove usi il mdulo e l’& che non è molto leggibile.  
estrarrei dei metodi tipo is\_pari? is\_dispari? in generale scompatterei  
un  
pò quella parte.

On 7/7/06, stefano sa [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> s=0  
> 15.times{|x| s += ((x & 1 != 0) ? pari : dispari).rindex(codice[x,1])  
> }  
> pari[(s % 26),1] == codice[15,1]  
> end

## – Chiaroscuro

Liquid Development: [http://liquiddevelopment.blogspot.com/](http://liquiddevelopment.blogspot.com/)

---

<div class="post-metadata">

**Author:** ![stefsava](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@stefsava](https://www.ruby-forum.com/u/stefsava)\
**Post date:** [July 7, 2006, 12:52pm UTC](https://www.ruby-forum.com/t/controllo-codice-fiscale/97481/4 "2006-07-07T12:52:54Z")

</div>

— stefano sa [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> Rispecchia lo spirito del linguaggio?

Io metterei pari e dispari come costanti al di fuori del metodo (PARI e DISPARI), oltretutto se le lasci all'interno vengono ricreate ogni volta. In teoria potresti usare #inject al posto di #times ed evitare la variabile s, ma imo non è più leggibile, son gusti.

Invece di x&1!=0 metterei un metodo #odd? dentro  
Integer.

Ho il sospetto che  
pari[(s % 26),1] == codice[15,1] possa funzionare  
anche come  
pari[s%26] == codice[15]  
ma ancora non ho preso il caffè 🙂

> A mio giudizio forse il codice sarà migliorabile,
> 
> ma il linguaggio e’ incredibilmente fantastico!

benvenuto a bordo 🙂

Chiacchiera con i tuoi amici in tempo reale!  
[Yahoo Search - Ricerca nel Web | Motore di Ricerca](http://it.yahoo.com/mail_it/foot/*http://it.messenger.yahoo.com)
