In JavaScript esiste il metodo .toFixed(decimals) che permette di arrotondare un numero al numero di decimali specificato e ritornare la corrispondente rappresentazione stringa
JavaScript: toFixed
(1234.567).toFixed(2)
// => "1234.57"
Purtroppo non esiste nessun metodo per formattare un numero in formato italiano, ovvero con la virgola come il separatore decimale e il punto come separatore delle migliaia.

Format number

La seguente funzione JavaScript accetta in ingresso un numero e numero di decimali desiderato, è ritorna un numero un formato stringa formattato in italiano
JavaScript: formatNumberIT
var sgart = sgart || {};
/**
 * Sgart.it
 * Prende un 'numero' e ritorna una 'stringa' formattata in italiano
 * con il separatore delle migliaia (punto) e dei decimali (virgola)
 * @param {number} n 
 * @param {number} decimals 
 * @returns {string}
 */
sgart.formatNumberIT = function(n, decimals) {
    if (typeof n === "undefined" || n == null) return "-";  // nessun numero passato
    if (typeof n !== "number") return NaN;
    if (decimals === undefined) decimals = 2;
    else if (decimals < 0) decimals = 0;
    var s = sn = n.toFixed(decimals), sd = "", p = s.indexOf('.');
    if (p !== -1) {
        sn = s.substr(0, p);
        sd = s.substr(p + 1);
    }
    //separatore delle migliaia
    var m = sn.length % 3, n1 = sn.substring(0, m);
    while (m < sn.length) {
        n1 = (m === 0 ? "" : n1 + ".") + sn.substring(m, m + 3);
        m += 3;
    }
    return sd !== "" ? n1 + "," + sd : n1;
};
esempio
JavaScript: Esempio
formatNumberIT(1234.567, 2)
// => "1.234,57"
A differenza del precedente esempio Fare il parsing e formattare i numeri italiani in JavaScript che troncava i numeri decimali, questo esegue un arrotondamento matematico.

Parse number

La funzione opposta, che fa il parsing di una stringa in formato italiano e restituisce un numero, è questa
JavaScript: parseNumberIT
/**
 * Sgart.it
 * Passando una 'stringa' che rappresenta un numero 
 * formattato in italiano, ritorna il corrispondente 'numero' 
 * @param {string} strNumero 
 * @returns {number}
 */
sgart.parseNumberIT = function (strNumero) {
    if (typeof strNumero !== "string") throw new Error("Not a string");
    if (strNumero == null) return 0;
    var s = strNumero.replace(/\./g, "").replace(",", ".");
    if (/^[\+\-]?[0-9]+(\.[0-9]+)?$/.test(s) === false) throw new Error("Not a valid number");
    return parseFloat(s);
};
esempio
JavaScript: Esempio
sgart.parseNumberIT("1.234,567")
// => 1234.567

Intl (Internationalization API)

Nei moderni browser esiste un alternativa per formattare i numeri, il namespace Intl che contiene le ECMAScript Internationalization API.

Ad esempio la formattazione dei numeri si può fare con
JavaScript
var nf = new Intl.NumberFormat(); 
nf.format(1234.567)
In questo caso il numero è formattato in base alle impostazioni internazionali del browser.

Per forzare uno specifico locale, in questo caso italiano (it-IT)
JavaScript
var nfIT = new Intl.NumberFormat("it-IT", {useGrouping: true, minimumFractionDigits: 2, maximumFractionDigits: 2});

nfIT.format(1234.456)
// => "1.234,46"
quindi la funzione sgart.formatNumberIT può essere riscritta in questo modo
JavaScript
/**
 * Sgart.it
 * Prende un 'numero' e ritorna una 'stringa' formattata in italiano
 * con il separatore delle migliaia (punto) e dei decimali (virgola)
 * @param {number} n 
 * @param {number} decimals 
 * @returns {string}
 */
sgart.formatNumberIT = function (n, decimals) {
    if (typeof n === "undefined" || n == null) return "-";  // nessun numero passato
    if (typeof n !== "number") return NaN;
    if (decimals === undefined) decimals = 2;
    else if (decimals < 0) decimals = 0;
    var nfIT = new Intl.NumberFormat("it-IT", {useGrouping: true, minimumFractionDigits: decimals, maximumFractionDigits: decimals});
    return nfIT.format(n);
}
Al momento non esiste una funzione equivalente nel namespace Intl per fare il parsing delle stringhe contenenti numeri.

Demo

Numero da formattare:


Numero da parsare:
Potrebbe interessarti anche: