Хочу поменять цену в продукте и сумму в договоре с денежного на дробное (0,0001). Веду разработку в своём пакете. Поменял тип данных в кофигураторе, сохранил и скомпилировал, перекэшировал.
Но к сожалению, две числа после запятых по умолчанию всё так же отображаются.
Как мне можно поменять этот тип данных? Причем не во всех колонках, а в отдельных могут быть задействованы три числа после запятой.
Также стоит проверить, везде ли изменилось: в объекте, в схеме страницы, в таблице базы. А ещё, если объект унаследован от другого или в других пакетах остался старый тип, и в результате учитывается именно он. Не уверен, что при переопределении схемы можно безбоязненно менять тип в объекте.
Часто для вывода в отчёте денежной суммы дробное число нужно оформить нужным образом, с разделением на нгултрумы и чертумы (или, скажем, рубли и копейки), также с пробелом или запятой между группами разрядов. Предлагается многофункциональная функция для осуществления такого форматирования.
function FormatFloat(Value, DecimalMark, ThousandSeparator, Prefix, Postfix, NoZero){
DecimalMark = IsNull(DecimalMark,',');
ThousandSeparator = IsNull(ThousandSeparator,' ');
Prefix = IsNull(Prefix,'');
Postfix = IsNull(Postfix,''); var Minus =(Math.abs(Value)!= Value)?' - ':'';
Value = Math.abs(Value); var Result =''; var Cop = Math.round((Value - Math.floor(Value))*100); if(Cop.toString().length>1||!!NoZero){
Result = Result + DecimalMark + Cop.toString(); }else{
Result = Result + DecimalMark +'0'+ Cop.toString(); } var IsFirstIteration =true;
while(true){ var Thousand = Math.floor(Value)- Math.floor(Value /1000)*1000; if(IsFirstIteration){
Result = Thousand + Result;
IsFirstIteration =false; }else{
Result = Thousand + ThousandSeparator + Result; }
Value = Math.floor(Value /1000); if(Value ==0){ return Prefix +Minus + Result + Postfix; }else{ if(Thousand 10){
Result ='00'+ Result; }else if(Thousand 100){
Result ='0'+ Result; } }
} }
Параметры:
Value — исходное дробное число. DecimalMark — десятичная запятая, точка или название валюты на её месте. ThousandSeparator — пробел или запятая между единицами, тысячами, миллионами и т.д. Prefix — название валюты перед числом. Postfix — название валюты или разменной монеты после числа. NoZero — если true, то 1 копейка, иначе — 01 копейка.
Примеры использования:
FormatFloat(-12345.67)//- 12 345,67
FormatFloat(1000003.62,' руб. ',null,null,' коп.')// 1 000 003 руб. 62 коп.
Также сходную задачу решает "коробочная" функция AmountToStr (скрипт scr_ConvertUtils), переводящая число в его написание словами. А если нужно ещё и склонять слово (1 копейка, 2 копейки,5 копеек), можно использовать соответствующий механизм.
Доброе утро всем. Мне нужно вывести любое число в отчете FR в след. формате: к примеру число 2033,33, вывести 2 033 руб. 33 коп. (с разделителями тысяч). И чтобы находилось это в одном Memo. Вопрос следующий: нужно функцию писать по разделению целой части числа на тысячи, миллионы, или есть другие варианты? просто удобно использовать форматирование числа в самом Memo на вкладке Format, но в моем варианте так не сделаешь, потому что в выражении Memo присутствует строка 'руб','коп.' и компилятор ругается. Подскажите, пож-ста, как лучше реализовать.
Здравствуйте, Антон!
А Вы не пробовали с помощью вычисляемых полей? то есть, создать поле, например AmountStr, в котором (на событии датасета OnDatasetCalcFields(Dataset)) с помощью функции AmountToStr "перевести" сумму числом в сумму прописью. кстати, про сумму прописью на комюнити есть много похожих тем. (например, здесь или здесь).
код примерно такой:
//amount to string
var Sum = Dataset.ValAsFloat('Amount');
var StringSum = Sum.toString()
var Result = AmountToStr(StringSum, 'ua', 'UAH');//в рублях -- AmountToStr(StringSum, 'ru', 'RUR');
Dataset.Values('AmountStr')= Result;
дополнительные параметры функции можно посмотреть в самой функции (кажется, она в скрипте scr_WindowUtils. кстати, этот скрипт нужно подключить при написании кода).
Разделитель тысяч ставим следющим образом:
[MySum #n%2,2n]
т.е к полю которое уже ([MySum]) есть дописываем #n%2,2n, тоже самое делает FastReport когда устанавливает DisplayFormat
Подробнее тут
P.S. В DisplayFormat FastReport'a такого отображения нет.
"Зверев Александр" написал:Ему не нужно прописью, нужно цифрами с пробелами.
да, я вчера затупила, прошу прощения. я просто больше обратила внимания на то, что нужны рубли и копейки...
"Каневский Антон Владимирович" написал:нужно функцию писать по разделению целой части числа на тысячи, миллионы, или есть другие варианты
Судя по всему, Вы были правы с самого начала -- нужно писать функцию. потому что по совету Гакало Игоря Вы можете только подправить разделение на тысячи, по моих ссылках -- перевести все в буквенный вариант.
Если бы я делала -- я бы бы взяла эту функцию AmountToStr и сделала бы по аналогии, только цифры не трогала бы. Правда, можно еще проще обойтись -- если валюта "постоянная" (например, только рубли) -- то прописать все для рублей и не рассматривать варианты для других валют.
В этом случае Вы также сможете предусмотреть вариант с двумя нолями.
Если нужна помощь в написании функции -- обращайтесь, буду рада помочь.