Здравствуйте.
Помогите с проблемкой, если у таковой есть решение.
JavaScript практически не знаю.

Суть: есть число (количество байт файла), например, 9036443008.
Необходимо вывести его в формате 8'617.8. То есть 9036443008/1024/1024.
Сейчас делаю так:
<td class="size"><script type="text/javascript">b = 9036443008/1048576.0; a += b; b = b.toFixed(1); document.write(eval(b));</script></td>

Проблема (точнее две) в том, как выводить разделитель (апостроф) между тройками чисел и как выводить всегда одно значение после запятой, даже если там 0 (сейчас он не выводится).

Выделить код

Код:

var b = 9036443008000 / 1048576.0;
b = b. toFixed (1);
var dl = "'"; // разделитель разрядов
var c = b. match (/(\d{0,2})((\d{3})*)(\.\d)$/);
var d = new Array (c [1], c [2]. match (/(\d{3})/g). join (dl));
var e = d. join (dl) + c [4];
document. write (e);

Подойдет ?
Наверняка можно и покороче, но не знаю как.

Короче - через replace можно

А. Стоп. Тут только с дробной частью. Нужно бы что-то вроде

Выделить код

Код:

/(\d{0,2})((\d{3})*)((\.\d)?)$/

Спасибо большое за помощь.

Только вот нюанс :)
Если число например такое 643.2 , то выводится как '643.2
Можно поправить?

princeandrew
Добавь перед последним объединением

Выделить код

Код:

if (d[0]=='') d.shift();

Супер.
Ещё раз большое спасибо.

как вам такой вариант :cool:

Выделить код

Код:

b=a.toFixed(1).split('.');
a=b[0].split('').reverse().join('').replace(/(\d{3}\B)/g,"\$1'").split('').reverse().join('')+'.'+b[1];

собственно в 'a' у нас число которое надо красиво нарисовать а 'b' это просто временная переменная

всё было бы ГОРАЗДО проще если бы удалось както replace рассматривать строку с конца а не с начала.
PS извиняюсь за 2 сообщения вместо 1. похоже прокся не пропускает пост запросы с переменными больше 512 байт

Rion

всё было бы ГОРАЗДО проще если бы удалось както replace рассматривать строку с конца а не с начала.

Хе, так можно, рассматривая строку как массив, поменять местами ее элементы (reverse), провести замену и поменять обратно :)
Хотя овчинка выделки не стоит, имхо.

Snik пишет

Хе, так можно, рассматривая строку как массив, поменять местами ее элементы (reverse), провести замену и поменять обратно :)

что я и сделал выше ;)
просто интересно было поэксперементировать как можно сократить код:)

Обходимся без split - reverse - join:

Выделить код

Код:

b=a.toFixed(1);
b=b.replace(/(\d{1,3}(?=(\d{3})+\.\d))/g,"\$1'");

Если уж через позиционную проверку, то надо как-то так

Выделить код

Код:

/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g
Al_H пишет

Если уж через позиционную проверку, то надо как-то так

Выделить код

Код:

/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g

Al_H, а зачем ?

Вот так:

Выделить код

Код:

/(\d{1,3}(?=(\d{3})+\.\d))/g

ведь короче.

в итоге можно написать ф-ию

Выделить код

Код:

function numFormat(a) { return a.toFixed(1).replace(/(\d{1,3}(?=(\d{3})+\.\d))/g,"\$1'"); }

ЗЫ плохо меня в детстве регуляным выражениям учили.. мог бы и сам до такого догадатсья :(:(:(

Давно сюда не заглядывал :)
Нифига себе :)
Ещё суперее сделали :)