14.01.2014, 14:03 | #1 |
Участник
|
Преобразование в real без округления?
Доброе время суток. Ситуация такая:
аксапта 3 имею переменную типа anytype , которая хранит 12700.00 имею переменную типа real. если положить переменную 1 в 2 то получаю во 2 12.00 Помогите, пожалуйста, произвести преобразование. Облазил все интернеты, пречитал все мануалы по типам аксапты. X++: ret.Qty1 = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value(); temp = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value(); //ret.Qty1 = str2num(Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value()); info(strfmt('C %1 %2 %3', Fields.itemIdx(costsLineTbl.ColumnLoadPaymDesk - 1).value(),num2str(ret.Qty1,3,3,3,3),temp)); Последний раз редактировалось АртемМелихов; 14.01.2014 в 14:06. |
|
14.01.2014, 14:24 | #2 |
Участник
|
Для начала, если переменная типа anytype хранит вещественное число (12700.00), то у нее фактический тип уже - real, поэтому с ней можно работать так же, как с другими переменными типа real, без лишних выкрутасов. В данном случае, по-моему, путаница возникает из-за своеобразного преобразования значения переменной в строку для вывода в инфолог - уберите num2str() и посмотрите, что получится.
|
|
14.01.2014, 14:29 | #3 |
Участник
|
Цитата:
Сообщение от gl00mie
Для начала, если переменная типа anytype хранит вещественное число (12700.00), то у нее фактический тип уже - real, поэтому с ней можно работать так же, как с другими переменными типа real, без лишних выкрутасов. В данном случае, по-моему, путаница возникает из-за своеобразного преобразования значения переменной в строку для вывода в инфолог - уберите num2str() и посмотрите, что получится.
|
|
14.01.2014, 14:45 | #4 |
Участник
|
обновление статуса ситуации. Данные загружал из excel. ячейки были финансового формата. Поменял на числовой без разделителя и сразу все ЗАРАБОТАЛО! Но вопрос все актуален. Не править же каждый раз документы перед загрузкой в аксапту.
|
|
14.01.2014, 15:33 | #5 |
Участник
|
Цитата:
Сообщение от АртемМелихов
Доброе время суток. Ситуация такая:
аксапта 3 имею переменную типа anytype , которая хранит 12700.00 имею переменную типа real. если положить переменную 1 в 2 то получаю во 2 12.00 Помогите, пожалуйста, произвести преобразование. Облазил все интернеты, пречитал все мануалы по типам аксапты. X++: ret.Qty1 = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value(); temp = Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value(); //ret.Qty1 = str2num(Fields.itemIdx(costsLineTbl.ColumnLoad - 1).Value()); info(strfmt('C %1 %2 %3', Fields.itemIdx(costsLineTbl.ColumnLoadPaymDesk - 1).value(),num2str(ret.Qty1,3,3,3,3),temp)); X++: anyType a = "2 900.00"; real b = a; ; info(strFmt("%1", typeof(a))); info(strFmt("%1", b)); a = strrem(a,' '); b = a; info(strFmt("%1", b)); Последний раз редактировалось maldini; 14.01.2014 в 16:00. |
|
14.01.2014, 15:36 | #6 |
Участник
|
|
|
14.01.2014, 15:49 | #7 |
Участник
|
При преобразовании в anyType в real DAX думает что пробел это конец записи. В job выше видно что и как происходит.
Последний раз редактировалось maldini; 14.01.2014 в 16:14. |
|
14.01.2014, 16:21 | #8 |
Участник
|
Цитата:
вот доказательство. X++: void loadEx(anytype _date) { int i; str _str; str temp = ""; ; _str = any2str(_date); info(_date); temp= ""; for (i=1;i<strlen(_str);i++) { if (subStr(_str,i,1) != " ") { temp += subStr(_str,i,1); } else info ("delete ' '"); } info ("result "+ temp); } |
|
14.01.2014, 16:26 | #9 |
Участник
|
Цитата:
Сообщение от АртемМелихов
нет. Нету там пробелов. Нету в excel и нету в переменной.
вот доказательство. X++: void loadEx(anytype _date) { int i; str _str; str temp = ""; ; _str = any2str(_date); info(_date); temp= ""; for (i=1;i<strlen(_str);i++) { if (subStr(_str,i,1) != " ") { temp += subStr(_str,i,1); } else info ("delete ' '"); } info ("result "+ temp); } что в info если написать так X++: info(strFmt("%1", typeof(_date))); info(strFmt("%1 длинна строки %2", _date,strLen(_date))); Последний раз редактировалось maldini; 14.01.2014 в 16:38. |
|
|
За это сообщение автора поблагодарили: АртемМелихов (1). |
14.01.2014, 16:36 | #10 |
Участник
|
прошу прошения, там есть пробелы. Загнал в строку, смотрите код выше, и теперь проверил по Ascii кодам. Есть 160 код. Спасибо, Сейчас поробую убить его и снова перевести.
|
|
14.01.2014, 16:44 | #11 |
Участник
|
все! Ура, спасибо огромное за совет! сделал метод обработки переменной.
X++: real loadEx(anytype _date) { int i; str _str; str temp = ""; real result; ; _str = any2str(_date); // info(_date); temp= ""; for (i=1;i<strlen(_str)+1;i++) { // info(strfmt(" %1",char2Num(_str,i))); if (char2Num(_str,i) != 160) { temp += subStr(_str,i,1); } // else info ("delete ' '"); } //info ("result "+ temp); result = str2num(temp); // info(strfmt("real %1",result)); return result; } |
|
15.01.2014, 08:26 | #12 |
Участник
|
АртемМелихов
X++: real loadEx(anytype _date) { if ( typeof(_date) == Types::String) { return str2num(strReplace(any2str(_date), num2Char(160), '')); } else { throw error("Косяк с _date вышел"); } } Последний раз редактировалось LeonDerCom; 15.01.2014 в 08:57. Причина: Добавлена проверка |
|
|
За это сообщение автора поблагодарили: АртемМелихов (1). |
15.01.2014, 08:55 | #13 |
Участник
|
|
|
Теги |
anytype, real |
|
|