[ТЕМА ЗАКРЫТА]
29.05.2014 04:34
Tiger
 
Не знаю правильно ли обозвал тему! Но суть вот в чем есть код:
Цитата:
for i = 0, __item.properties:size() - 1 do
local property = __item.properties:at(i);
if (ukm.binary(property.flags) *
ukm.binary(ukm.item_property.flgprint)):get() ~= 0 then
local property_name = property.code;
if property.name ~= nil then
property_name = property.name:get();
end
text = text .. ukm.adjustment(" " .. property_name, property.value .. " ", width, ".") .. "\n";

Сюда вставляю свой код!

end
end
Пытаюсь добавить

Цитата:
if property_name == 'Сумма' then
sum = property.value:get();
commission = property.value - property.value * 0.04;
end
if property_name == 'Номер телефона' then
text = text .. ukm.adjustment("Сумма с комиссией (4%)",commission .. " ", width, ".") .. "\n";
end
Проблема в следующем кода property.value целое число всё отрабатывает без ошибок, стоит значение поставить дробным (через точку с копейками) получаю ошибку
Цитата:
ReceiptAppendPayment: [string "receipt.lua"]:156: attempt to perform arithmetic on field 'value' (a string value)
Проверяю тип property.value - string. Если в качестве эксперимента поставить вместо property.value значение 15.20, тоже все без ошибок. Как преобразовать property.value?

Версия УКМ 52 sp1!
29.05.2014 07:54
OlegON
 
Значительно сузил круг отвечающих только до тех, кто пользуется УКМ4 твоей версии.
Трудно было выдрать весь нужный тебе кусок и выделить, в какой строке ошибка?
Не вижу, где у тебя определяется property, накидал просто кусок кода
Код:
#!/usr/bin/lua
val = "String";
val = "7";
comission = val - val * 0.04;
print (comission);
все работает, что не так? Очень не люблю неявное приведение типов, от него много бед, т.е. рекомендую val завернуть в tonumber.
29.05.2014 08:55
student
 
Цитата:
Tiger Проблема в следующем кода property.value целое число всё отрабатывает без ошибок, стоит значение поставить дробным (через точку с копейками) получаю ошибку
можно и без объявления сделать - считать все в копейках (как в сбере) - т.е. добавить умножение на 100 и потом выводить результат деленный на 100 :)

хотя Олег прав

Цитата:
OlegON Очень не люблю неявное приведение типов, от него много бед
29.05.2014 11:04
Tiger
 
Цитата:
OlegON Значительно сузил круг отвечающих только до тех, кто пользуется УКМ4 твоей версии.
Трудно было выдрать весь нужный тебе кусок и выделить, в какой строке ошибка?
Не вижу, где у тебя определяется property, накидал просто кусок кода
Код:
#!/usr/bin/lua
val = "String";
val = "7";
comission = val - val * 0.04;
print (comission);
все работает, что не так? Очень не люблю неявное приведение типов, от него много бед, т.е. рекомендую val завернуть в tonumber.
Попробовал, с целым числом всё без ошибки, а если поставить val = "7.5" то ошибка, если "7,5" ошибка уходит!
29.05.2014 11:29
OlegON
 
Логично, преобразование происходит с учетом локали. У меня, например, при "," ошибка появляется, поэтому

Код:
#!/usr/bin/lua
val = "String";
val = "7,5";
val = string.gsub(val,",",".");
comission = val - val * 0.04;
print (comission);
ты разберись, какие локали могут быть, а то там и пробелы и запятой тысячи отделять могут в разных локалях... Надо фиксировать, что может прилететь.
29.05.2014 13:37
student
 
Цитата:
OlegON Надо фиксировать, что может прилететь.
либо оставить на усмотрение системы и умножать\делить на 100 с неявным приведением типов :)
29.05.2014 13:43
OlegON
 
Так у него с локалью проблемы, как он на 100 умножит?
29.05.2014 13:46
Mtirt
 
А нельзя вернуться к первоначальному предложению и использовать tonumber() ?
29.05.2014 13:52
OlegON
 
Все бы хорошо, но при каше с региональными настройками, когда вместо десятичного разделителя используется то запятая, то точка, это не поможет...
29.05.2014 14:05
Tiger
 
Цитата:
OlegON Логично, преобразование происходит с учетом локали. У меня, например, при "," ошибка появляется, поэтому

Код:
#!/usr/bin/lua
val = "String";
val = "7,5";
val = string.gsub(val,",",".");
comission = val - val * 0.04;
print (comission);
ты разберись, какие локали могут быть, а то там и пробелы и запятой тысячи отделять могут в разных локалях... Надо фиксировать, что может прилететь.
Вставляю скрипт этот пример, на выходе получаю вместо 7.5 (...) три точки! Чего не так?

Получается на кассе в форме ввожу сумму через точку, а чтобы в скрипте выполнить расчет необходимо чтобы тоже значение было с запятой!
29.05.2014 14:41
OlegON
 
ну и поменяй точку на запятую, пример с gsub выше...
29.05.2014 14:46
Tiger
 
Цитата:
OlegON ну и поменяй точку на запятую, пример с gsub выше...
В том то и дело что меняются почему-то все символы (в том числе и цифры) на запятые
29.05.2014 14:47
OlegON
 
Запусти отдельно этот скрипт и рассказывай, где как и что запускаешь, если не получается.
29.05.2014 14:52
vdm
 
Да заверни ты все в tonumber и посмотри что получится.
На кассе на локали можно забить, там не зоопарк.

Код:
commission = tostring(tonumber(property.value) - tonumber(property.value) * 0.04);
29.05.2014 14:53
Tiger
 
Цитата:
OlegON Запусти отдельно этот скрипт и рассказывай, где как и что запускаешь, если не получается.
Полностью закинул твой пример в свой цикл

Цитата:
for i = 0, __item.properties:size() - 1 do
local property = __item.properties:at(i);
if (ukm.binary(property.flags) *
ukm.binary(ukm.item_property.flgprint)):get() ~= 0 then
local property_name = property.code;
if property.name ~= nil then
property_name = property.name:get();
end
text = text .. ukm.adjustment(" " .. property_name, property.value .. " ", width, ".") .. "\n";
if property_name == 'Сумма' then
val = "String";
val = tostring(7.5);
val = string.gsub(val,".",",");

end
if property_name == 'Номер телефона' then
text = text .. ukm.adjustment("Сумма с комиссией (4%)",val .. " ", width, ".") .. "\n";
end
end
end
В переменной val получаю вместо 7,5 три точки
29.05.2014 14:56
Tiger
 
Цитата:
vdm Да заверни ты все в tonumber и посмотри что получится.
На кассе на локали можно забить, там не зоопарк.

Код:
commission = tostring(tonumber(property.value) - tonumber(property.value) * 0.04);
С целым числом например 50 всё без ошибок, ввел на кассе 15.20 ошибка
Цитата:
ReceiptAppendPayment: [string "receipt.lua"]:160: attempt to perform arithmetic on a nil value
29.05.2014 15:08
vdm
 
Покажи в каком виде property.value возвращается.

Код:
commission = property.value;
29.05.2014 15:23
Tiger
 
Цитата:
vdm Покажи в каком виде property.value возвращается.

Код:
commission = property.value;
commission = property.value; возвращается значение 15.20

commission = type(property.value); возвращает string
29.05.2014 15:29
Tiger
 
Цитата:
Tiger В том то и дело что меняются почему-то все символы (в том числе и цифры) на запятые
Eсли property.value = 15.20, функцией gsub string.gsub(property.value,"1",","), то получаю результат ,5.20. Почему когда меняю string.gsub(property.value,".",","), получаю ,,,,, - пять запятых?
29.05.2014 15:44
student
 
Цитата:
OlegON Так у него с локалью проблемы, как он на 100 умножит?
у меня не на чем протестировать - луа нету, но в винде в аксесе умножение проходит над строкой в зависимости от локали - если локаль точка и на входе в строке точка все рассчитается - аналогично как и с запятой

правда если локаль точка а строка идет с запятой или наоборот, то тогда уже вопрос к ф-ции которая так возвращает строку в которой разделитель числа отличается от локали:)

самому стало интересно :) решил погуглить


там есть

function userdata.numberformat(amount)
-- replace decimal point with comma (= German format)
return string.gsub(string.format("\%.2f", amount), "%.", ",")
end
29.05.2014 15:59
vdm
 
У меня в виндовом веб-интерфейсе на старой версии укм, "15.20" нормально преобразуется в число, nil получается от строки с запятой. Или на кассе по-другому, или в твоей версии поменялось.

Насчет замены в gsub, там точка - это спецсимвол regexp, в lua ее процентом экранировать нужно.

Код:
string.gsub(property.value, "%.", ",");
29.05.2014 17:39
Tiger
 
Завтра попробую оба вариант! А как на крайний случай перебрать по символьно строку в цикле и склеить уже строку с запятой вместо точки?
30.05.2014 05:56
Tiger
 
Всё получилось действительно нужно было поставить % перед точкой
Цитата:
string.gsub(property.value, "%.", ",");
Ну а дальше уже формула рассчитала комиссию!
30.05.2014 06:42
Mtirt
 
Насколько я помню, в УКМ4 надо не в число это всё переводить а в currency.
Т.е. tocurrency использовать. Причем, это лучше сделать с 0.04. Её привести и умножить...
30.05.2014 18:12
Павел Сосновских
 
tocurrency не нашел
точно есть ukm.currency()

например, есть такой код в receipt.lua:
Код:
text = text .. ukm.adjustment(" " .. discount.name, tostring(discount.increment*ukm.currency(-1)) .. " ", width, " ") .. "\n";
так что надо:
Код:
commission = tostring(ukm.currency(property.value) - ukm.currency(property.value)*ukm.currency(0.04));
02.06.2014 07:10
Mtirt
 
Да, конечно ukm.currency().
05.06.2014 19:12
Tiger
 
Цитата:
for i = 0, __item.properties:size() - 1 do
local property = __item.properties:at(i);
if (ukm.binary(property.flags) *
ukm.binary(ukm.item_property.flgprint)):get() ~= 0 then
local property_name = property.code;
if property.name ~= nil then
property_name = property.name:get();
end
text = text .. ukm.adjustment(" " .. property_name, property.value .. " ", width, ".") .. "\n";
if property_name == 'Сумма' then
commission = string.gsub(property.value, "%.", ",")-string.gsub(property.value, "%.", ",")*0.04;
end
if property_name == 'Номер телефона' then
text = text .. ukm.adjustment("Сумма с комиссией (4%)",round(commission,2) .. " ", width, ".") .. "\n";
end
end
end
На толкнулся еще на одну проблему почему-то в чеке не печатается строка property.name равна Сумма! Из какой таблицы берутся property.value и property.name? Вследствие чего получаю ошибку так ка comission равна null!
05.06.2014 19:13
Tiger
 
Цитата:
Mtirt Да, конечно ukm.currency().
Ошибка:

Цитата:
16:45:01: 0x00004000: WARNING: debug#/usr/local/storage/home/ukm/build-br-59-2014_05_29_15_43_01/ukm/libukm/ccore.cpp(3275) ReceiptAppendPayment: No matching overload found, candidates:
void __init(luabind::argument const&,quantity const&)
void __init(luabind::argument const&,currency const&)
void __init(luabind::argument const&,custom [d])
06.06.2014 06:58
Mtirt
 
Объясни мне, как я по сообщению об ошибке должна угадать, что ты там такого понаписал?
06.06.2014 07:38
Tiger
 
Цитата:
Mtirt Объясни мне, как я по сообщению об ошибке должна угадать, что ты там такого понаписал?
commission = tostring(ukm.currency(property.value) - ukm.currency(property.value)*ukm.currency(0.04));


Опции темы


Часовой пояс GMT +3, время: 13:22.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.