Number_format Javascript
- Febbraio 25, 2012
- by
- Donatantonio
Chi conosce e sviluppa quotidianamente in linguaggio PHP conoscerà di sicuro la funzione number_format che permette, appunto, di formattare un valore numerico impostando il numero di decimali da visualizzare e i caratteri di separazione per le migliaia e per la parte decimale.
Putroppo, come spesso capita, in linguaggio Javascript non esiste una funzione simile pronta all’uso.
In quest’articolo svilupperemo la versione Javascript della funzione number_format.
Enunciamo innanzitutto la sintassi e i parametri che tale funzione accetta:
number_format(valore,decimali,separatore_decimali,separatore_migliaia)
se ad esempio volessimo formattare il numero “1250.784” impostando 2 cifre decimali, la virgola come separatore dei decimali e il punto per le migliaia, invocheremo la funzione nel seguente modo:
number_format(1250.784,2,',','.'); // ottenendo come output 1.250,78
Vediamo subito il codice della funzione number_format. Ricordo che in fondo all’articolo sono presenti i link per provare il codice e scaricarlo.
function toFixedFix(n, precisione) { // Funzione per arrotondare valore var k = Math.pow(10, precisione); return '' + Math.round(n * k) / k; } function number_format(numero, decimali, dec_separatore, mig_separatore){ // Elimino i caratteri che non sono numeri (lascio il segno meno e il punto) numero = (numero).replace(/[^0-9\.\-]?/gi,""); // Controllo se valore numerico var n = 0; if(isFinite(+numero)){ n=numero; } // Controllo se i decimali sono accettabili var precisione = 0; if(isFinite(+decimali) && decimali>-1){ precisione = decimali; } // Recupero caratteri separatori var separatore = '.'; if(typeof mig_separatore != 'undefined'){ separatore = mig_separatore; } var dec = ','; if(typeof dec_separatore != 'undefined'){ var dec = dec_separatore; } // Arrotondo il valore se necessario - Utilizzo funzione toFixedFix var s = ''; if(precisione!=0){ s = toFixedFix(n, precisione); }else{ s = '' + Math.round(n); } // Taglio il valore in parte intera e parte decimale s = s.split('.'); // Aggiungo il separatore delle migliaia - ogni 3 numeri sulla parte intera if (s[0].length > 3) { s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, separatore); } // Formatto la parte decimale - aggiungo degli 0 se necessari if ((s[1] || '').length < precisione) { s[1] = s[1] || ''; s[1] += new Array(precisione - s[1].length + 1).join('0'); } // Aggiungo parte decimale a parte intera - separati da separatore decimali return s.join(dec); }
Il codice non è difficile da comprendere ed è grossomodo commentato. Vediamo però i passi fondamentali che esso compie:
- Definisco una semplice funzione “toFixedFix” di supporto che arrotonda/tronca in maniera opportuna un valore numerico.
- All’inizio della funzione number_format pulisco innanzitutto il valore da formattare.
- Effettuo alcuni semplici controlli: se il valore da formattare e il numero di cifre decimali sono numerici.
- Chiamo la funzione toFixedFix per arrotondare/troncare il valore.
- Taglio il valore (ora parzialmente formattato) in parte intera e parte decimale.
- Aggiungo il separatore delle migliaia (ogni 3 cifre) alla parte intera.
- Formatto la parte decimale aggiungendo degli zeri se necesssario.
- Concateno la parte intera con quella decimale.
A parte l’utilizzo della funzione toFixedFix, creata per l’occasione, nel codice utilizziamo alcune funzioni base del linguaggio, tra cui:
replace(…) per sostituire i caratteri non accettabili
isFinite(numero) per controllare se il valore è numerico
split(.) per tagliare il numero in parte intera e parte decimale
join() per unire parte decimale a parte intera
Logicamente, come è mio solito sottolineare, questa è solo una delle possibile soluzione della funzione number_format.
Cliccando qui è possibile vedere in azione il codice.
Cliccando qui è possibile scaricare il codice.