Format number in JavaScript
In JavaScript esiste il metodo .toFixed(decimals) che permette di arrotondare un numero al numero di decimali specificato e ritornare la corrispondente rappresentazione stringa
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.
esempio
esempio
Ad esempio la formattazione dei numeri si può fare con
In questo caso il numero è formattato in base alle impostazioni internazionali del browser.
Per forzare uno specifico locale, in questo caso italiano (it-IT)
quindi la funzione sgart.formatNumberIT può essere riscritta in questo modo
JavaScript: toFixed
(1234.567).toFixed(2)
// => "1234.57"
Format number
La seguente funzione JavaScript accetta in ingresso un numero e numero di decimali desiderato, è ritorna un numero un formato stringa formattato in italianoJavaScript: 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;
return (sd !== "" ? n1 + "," + sd : n1).replace("-.", "-");
};
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, è questaJavaScript: 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);
};
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)
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"
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.