PHP e i numeri con lo zero davanti

Mi chiama un cliente e mi chiede: “come mai nel sito tra la data 02/06/2013 e 16/06/2013 vedo uno 00/06/2013”?

La domanda è sensata, mi metto al lavoro e provo a capire cosa c’è che non va. Le date vengono salvate in un array PHP che ha la seguente struttura:

array (
  'JAN' => NULL,
  'FEB' => NULL,
  'MAR' => NULL,
(...)
  ),
  'JUN' => 
  array (
    'monthdays' => 
    array (
      0 => 2,
      1 => 0,
      2 => 16,
      3 => 23,
      4 => 30,
    ),
  ),

Effettivamente là in mezzo uno zero c’è! Però nel file dal quale carichiamo l’array il valore è corretto:

‘JUN’=>array(‘monthdays’=>array(02,09,16,23,30)),

Allora che diavolo succede? Ne discuto un po’ con un collega ed iniziamo a fare degli esperimenti. All’inizio pensiamo che si tratti della posizione e proviamo a spostare i valori dell’array, ad esempio (02,16,09,23,30). Niente da fare, permane lo 0. Proviamo allora a togliere lo 0 davanti al 9, ed effettivamente la data viene visualizzata correttamente. Ma perché allora lo zero davanti al 9 rompe mentre davanti al 2 non è un problema? Iniziamo a sostituire il 9 con altre cifre. Con 8 viene nuovamente visualizzato 0, mentre dal 7 in giù viene prontamente mostrato il numero corretto. E’ GIALLO!

Ci pensiamo un minuto, la cosa suona davvero strana. Cos’è che caratterizza i numeri da 1 a 7? Per un informatico la risposta non tarda ad arrivare: sono le cifre della base 8.

Indaghiamo un po’ online, troviamo un paio di post su stackoverflow ed il problema è presto svelato. I numeri che iniziano con 0 sono interpretati, secondo le specifiche PHP, come numeri ottali. Di conseguenza da 00 a 07 non c’è problema, ma poi 08 e 09 non hanno significato, quindi viene restituito 0.

Il tranello sarebbe stata più difficile da svelare se avessimo avuto, come nei post riportati, numeri più grandi di 9. Capire che 042 in ottale è 34, per esempio, non è certo ovvio.

Non che voglia mettere il dito nelle scelte architetturali dei guru che hanno pensato a suo tempo il PHP ma personalmente, vista la frequenza con cui utenti e consulenti inseriscono le date con lo 0 davanti pensando di avere un’omogeneità di presentazione, ritengo questa decisione piuttosto discutibile.

5 commenti su “PHP e i numeri con lo zero davanti

Rispondi a Kevin Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.