Из старых запасов
/**
Функция groupNums принимает число или
строку, которую конвертирует по правилам
parseFloat.
Возвращает строку, где цифры числа
сгруппированы по разрядам и отделены друг от
друга пробелом. Если конвертация в число
невозможна или число в научном формате и не
разворачивается при конвертации, будет
возвращено строковое представление переданного
аргумента.
Недесятичные числа конвертируются в
десятичные. Часть строки, отброшенная при
конвертации, приписывается справа к
результату работы функции, т.е. можно передавать
10000р., например.
*/
function groupNums(num){
var
minus = fractionPart = firstsDigits = textPart = "",
dotPosition,
rawText = num + ''
;
num = parseFloat(rawText) + '';
if(num === "NaN" || ~num.indexOf("e")) {// Нечисло и научный формат не обрабатываем
return rawText;
}
textPart = rawText.substr(num.length);
if(num.substr(0, 1) === "-") {// Разбор отрицательных чисел
minus = "-";
num = num.substr(1);
}
if(~(dotPosition = num.indexOf("."))) {// Разбор дробей
fractionPart = num.substr(dotPosition);
num = num.substr(0, dotPosition)
}
if(num.length < 4) {
return rawText;
}
firstsDigits = num.substr(0, num.length % 3);
num = num.substr(firstsDigits.length);
num = num.match(/\d{3}/g).join(" ");
firstsDigits += firstsDigits.length > 0 ? " " : "";
return minus + firstsDigits + num + fractionPart + textPart;
}
Но на форуме точно есть решение от Kolyaj, где он делает это одной регой. Искать лень.