Форум OlegON > Программы и оборудование для автоматизации торговли > Кассовые программы > УКМ-4

Как в lua умножить дробное число на целое число : УКМ-4

29.03.2024 18:17


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 (...) три точки! Чего не так?

Получается на кассе в форме ввожу сумму через точку, а чтобы в скрипте выполнить расчет необходимо чтобы тоже значение было с запятой!
Часовой пояс GMT +3, время: 18:17.

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