Склад / Javascript
CSS | PHP

Javascript

Вывод чисел в национальном формате

Вот и сделан новый подсчёт нужных значений на сайте! Выглядит почти здорово — только одно "но": выводящиеся значения практически сливаются для глаза. 150000 или 1500000 — сразу и не поймёшь, какое именно число перед тобой, пока не посчитаешь количество нулей.

Сразу начинаешь задумываться: почему так? Ответ приходит быстро: в операционной системе все числа приводятся к национальному формату: если я живу в России, то привычно, что тысячи «отбиваются» пробелами, а дробная часть — не «по-программистски» — запятой.

И вроде даже найден выход: у объекта Number есть метод toLocaleString. Прописываем для вывода — и радуемся: ура! все значения выглядят, как в Windows! ...но что же это? Работает только в Internet Explorer да в Firefox. Несколько мгновений спустя приходит в голову мысль: а вдруг в Linux это вообще не будет работать?

Ругаемся менее полуминуты — и понимаем: нужно написать свою функцию.

Тут уже всё просто. Поразмыслив, понимаем, что вывод этого подсчёта будет актуален только россиянам, поэтому можно форматировать строку под русский стандарт. Итак, создаём свой метод:

  1. Number.prototype.triads = function (triadSeparator, decSeparator, fractNum)
  2. {
  3.   if (typeof(fractNum)=='undefined') fractNum = 2;
  4.   var num = parseInt(this).toString();
  5.   var numd = this.toString();
  6.   numd = numd.toString().substr(numd.indexOf('.')+1, fractNum);
  7.   while (numd.length<fractNum)
  8.     numd += '0';
  9.   var regEx = /(-?\d+)(\d{3})/;
  10.   while (regEx.test(num)) { num = num.replace(regEx,"$1"+triadSeparator+"$2"); }
  11.   if (numd)
  12.   { num += decSeparator+numd; }
  13.   return num;
  14. }

Результат работы можно будет проверить так:

  1. var num=15000.45123;
  2. alert('num = '+num.triads(' ', ','));

Вывод будет похожим на это:

num = 15 000,45

Если разобрать подробнее, то в переменную num мы сохраняем целую часть значения, а потом регулярным выражением разбиваем его на триады, между которыми вставляем указанный разделитель.

С дробной частью немного сложнее: в силу особенностей работы JavaScript с дробными числами, на выходе мы могли получить совсем не то, что нам нужно. Поэтому с дробной частью нужно работать, как со строкой, — и мы всего лишь копируем всю дробную часть, всё, что после точки. Полученную часть дополняем нулями и соединяем всё через указанный разделитель. Вуаля!

P.S. Можно ещё улучшить вывод, но к функции это уже не имеет отношения. Итак, если указать вместо пробела для отбивки триад символ неразрывного пробела, то наше число не будет рассыпаться на части в конце строки.