Javascript
Вывод чисел в национальном формате
Вот и сделан новый подсчёт нужных значений на сайте! Выглядит почти здорово — только одно "но": выводящиеся значения практически сливаются для глаза. 150000 или 1500000 — сразу и не поймёшь, какое именно число перед тобой, пока не посчитаешь количество нулей.
Сразу начинаешь задумываться: почему так? Ответ приходит быстро: в операционной системе все числа приводятся к национальному формату: если я живу в России, то привычно, что тысячи «отбиваются» пробелами, а дробная часть — не «по-программистски» — запятой.
И вроде даже найден выход: у объекта Number есть метод toLocaleString. Прописываем для вывода — и радуемся: ура! все значения выглядят, как в Windows! ...но что же это? Работает только в Internet Explorer да в Firefox. Несколько мгновений спустя приходит в голову мысль: а вдруг в Linux это вообще не будет работать?
Ругаемся менее полуминуты — и понимаем: нужно написать свою функцию.
Тут уже всё просто. Поразмыслив, понимаем, что вывод этого подсчёта будет актуален только россиянам, поэтому можно форматировать строку под русский стандарт. Итак, создаём свой метод:
- Number.prototype.triads = function (triadSeparator, decSeparator, fractNum)
- {
- if (typeof(fractNum)=='undefined') fractNum = 2;
- var num = parseInt(this).toString();
- var numd = this.toString();
- numd = numd.toString().substr(numd.indexOf('.')+1, fractNum);
- while (numd.length<fractNum)
- numd += '0';
- var regEx = /(-?\d+)(\d{3})/;
- while (regEx.test(num)) { num = num.replace(regEx,"$1"+triadSeparator+"$2"); }
- if (numd)
- { num += decSeparator+numd; }
- return num;
- }
Результат работы можно будет проверить так:
- var num=15000.45123;
- alert('num = '+num.triads(' ', ','));
Вывод будет похожим на это:
num = 15 000,45Если разобрать подробнее, то в переменную num мы сохраняем целую часть значения, а потом регулярным выражением разбиваем его на триады, между которыми вставляем указанный разделитель.
С дробной частью немного сложнее: в силу особенностей работы JavaScript с дробными числами, на выходе мы могли получить совсем не то, что нам нужно. Поэтому с дробной частью нужно работать, как со строкой, — и мы всего лишь копируем всю дробную часть, всё, что после точки. Полученную часть дополняем нулями и соединяем всё через указанный разделитель. Вуаля!
P.S. Можно ещё улучшить вывод, но к функции это уже не имеет отношения. Итак, если указать вместо пробела для отбивки триад символ неразрывного пробела, то наше число не будет рассыпаться на части в конце строки.