Если вас устраивает целочисленная часть (я не смотрел на нее подробно), то:
function formatDecimal(n) {
n = n.split('.');
return commafy(n[0]) + '.' + n[1];
}
Конечно, вы можете сначала провести тестирование n , чтобы убедиться, что все в порядке, но это логика.
Редактировать
по электронной почте Ой! пропустил немного о пробелах! Вы можете использовать то же регулярное выражение, что и commafy, за исключением пробелов вместо запятых, а затем отменить результат.
Вот функция, основанная на vol7ron и не использующая реверс:
function formatNum(n) {
var n = ('' + n).split('.');
var num = n[0];
var dec = n[1];
var r, s, t;
if (num.length > 3) {
s = num.length % 3;
if (s) {
t = num.substring(0,s);
num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
} else {
num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
}
}
if (dec && dec.length > 3) {
dec = dec.replace(/(\d{3})/g, "$1 ");
}
return num + (dec? '.' + dec : '');
}