UMIhelp

Разработка сайта на UMI.CMS => JS и AJAX => Тема начата: sam от 17 Октября 2014, 10:15:39

Название: JS+AJAX - формат цены без суффикса и префикса
Отправлено: sam от 17 Октября 2014, 10:15:39
admin уже в курсе о чём здесь пойдет речь. Всё о том же, в интернете много разных скриптов для формата числа - не могу понять, как можно подключать их в свои скрипты. Например, в basket.js в конце есть блок, который вроде обновляет сумму заказа динамически при изменении количество заказываемых товаров:

	jQuery('.change-amount .bottom').click(function(){
if (site.basket.modify.complete) {
site.basket.modify.complete = false;
var id = parseInt(this.parentNode.parentNode.parentNode.className.split('_').pop()),
e = this.parentNode.previousSibling,
old = e.value;
e.value = (parseInt(old) - 1);
e.previousSibling.value = e.value;
site.basket.modify(id, e.value, old);
}
});

Как к этой функции можно применить формат цены в виде, например 99 990, т.е. с пробелами тысячных разрядов?

Если предложите универсальный код, который можно будет использовать во всех необходимых местах basket.js, буду Вам крайне признателен за это, если не универсальный, всё равно заранее моё спасибо!

P.S. Есть одна статья, где есть одно решение, только тоже не могу понять, как подключить, и подойдет ли такой вариант?! Вроде здесь, имеющиеся файлы сайта трогать не надо. См. http://ipolh.com/development/formatirovanie-tseny-na-js/ (http://ipolh.com/development/formatirovanie-tseny-na-js/)
Название: Re:JS+AJAX - формат цены без суффикса и префикса
Отправлено: sam от 18 Октября 2014, 00:26:00
Внимание! Обязательно, прежде, чем вносить изменения в basket.js, сделайте копию этого файла, на всякий случай.


Сам задавал вопрос, сам же и отвечу на него - мне удалось реализовать задуманное (разделение цифр в корзине, где js-методы, на тысячные разряды).

По пунктам:
1. Нашел, на мой взгляд, вполне достойный, а самое главное, рабочий скрипт (см. ниже), где помимо самого скрипта, описаны примеры форматов и их результаты после обработки цифр этим скриптом:

function number_format(number, decimals, dec_point, thousands_sep) {
// example 1: number_format(1000.00) .................... returns: '1,000'
// example 2: number_format(1000.00, 0, ',', ' ') ....... returns: '1 000'
// example 3: number_format(1000.00, 2, ',', ' ') ....... returns: '1 000,00'
// example 4: number_format(1000.0000, 2, '.', '') ...... returns: '1000.00'
// example 5: number_format(10, 2, ',', '.') ............ returns: '10,00'
// example 6: number_format(1000) ....................... returns: '1,000'
// example 7: number_format(10.000, 2) .................. returns: '10.00'
// example 8: number_format(1000.55, 1) ................. returns: '1,000.6'
// example 9: number_format(10000, 5, ',', '.') ......... returns: '10.000,00000'
// example 10: number_format(0.9, 0) .................... returns: '1'
// example 11: number_format('1.10', 2) ................. returns: '1.10'
// example 12: number_format('1.10', 4) ................. returns: '1.1000'
// example 13: number_format('1.1000', 3) ............... returns: '1.100'
// example 14: number_format('1 000,50', 2, '.', ' ') ... returns: '100 050.00'
// example 15: number_format(1e-8, 8, '.', '') .......... returns: '0.00000001'
number = (number + '')
.replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function (n, prec) {
var k = Math.pow(10, prec);
return '' + (Math.round(n * k) / k)
.toFixed(prec);
};
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
.split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '')
.length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1)
.join('0');
}
return s.join(dec);
}

2. Взял basket.js (/js/site/basket.js), сделал бэкап файла (это, если вдруг испорчу скрипт - я не программист, и не разработчик), открыл basket.js и в самое начало над "site.basket = {};" вставил вышеприведенный код.

3. Затем, так как мне надо было получить сумму такого формата "99 990", я выбрал пример 2/example 2 - number_format(1000.00, 0, ',', ' '), и в basket.js начал заключать в него все то, что отвечает за вывод цифр/цен.
Поясняю, нижеприведенный код, это часть basket.js, где я вносил правки (функция "site.basket.replace = function(id)" начиная с "if (e.summary.amount > 0)"):

...
if (e.summary.amount > 0) {
text = number_format(e.summary.price.actual, 0, ',', ' ') + ' ' + e.summary.price.suffix;
goods_discount = ((typeof e.summary.price.original == 'undefined') ? number_format(e.summary.price.actual, 0, ',', ' ') : number_format(e.summary.price.original, 0, ',', ' ')) + ' ' + e.summary.price.suffix;
discount = ((typeof e.summary.price.discount != 'undefined') ? number_format(e.summary.price.discount, 0, ',', ' ') : '0') + ' ' + e.summary.price.suffix;
for (i in e.items.item) {
item = e.items.item[i];
if (item.id == id) {
rem_item = false;
item_total_price = number_format(item["total-price"].actual, 0, ',', ' ') + ' ' + item["total-price"].suffix;
item_discount = ((typeof item.discount != 'undefined') ? number_format(item.discount.amount, 0, ',', ' ') : '0') + ' ' + item["total-price"].suffix;
}
...

Поясняю дальше... Если присмотритесь в код и сравните с имеющимся у вас, поймете, что, например, следующая часть кода раньше был таким:

text = e.summary.price.actual + ' ' + e.summary.price.suffix;
 
А я внес коррективы в код, т.е. заключил вывод цены в нужный мне формат - код ниже:

text = number_format(e.summary.price.actual, 0, ',', ' ') + ' ' + e.summary.price.suffix;

И так далее... Думаю, если я разобрался, как это реализовать, и вам не составить труда сделать это, если возникнет такая потребность. Тем более, что примеры форматов в скрипте имеются, выбирай не хочу.

Благодарю за внимание!

P.S. Про то, как в xslt как аналогичную вещь сделать, предлагаю воспользоваться советом/вариантом от admin http://umihelp.ru/forum/index.php/topic,1925.0.html (http://umihelp.ru/forum/index.php/topic,1925.0.html)


Внимание! Обязательно, прежде, чем вносить изменения в basket.js, сделайте копию этого файла, на всякий случай.

Название: Re:JS+AJAX - формат цены без суффикса и префикса
Отправлено: admin от 19 Октября 2014, 01:28:15
Приятно, что вы публикуете результаты своих поисков, они могут очень помочь другим.
Название: Re:JS+AJAX - формат цены без суффикса и префикса
Отправлено: sam от 20 Октября 2014, 00:45:31
Ничего особенного - реализовал свою задумку, опубликовал полученный результат (код-то/скрипт не мой - какой-то щедрый программист выложил, чтобы такие, как я могли воспользоваться). А мне приятно, что Вы, когда надо ведете меня за руку, чтобы воплощать в жизнь что-то. Так что, считайте, что я перед Вами в долгу не остаюсь. Моё Вам почтение.