AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.04.2009, 09:28   #21  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Попробую еще раз.

МОЕ ПОНИМАНИЕ ПРОБЛЕМЫ:
Цитата:
Сообщение от valentino Посмотреть сообщение
Возникла проблема преобразования из текстового представления числа в само число, т.е. из "123 456.78" в 123456.78.
...
Текстовое представлене числа изначально в Аксапте формируется с помощью функции strfmt("%1", число).
МОЕ РЕШЕНИЕ ПРОБЛЕМЫ:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Функция strFmt возвращает в виде строки ... real-число - с двумя десятичными знаками ... можно оставить в строке только 10 цифровых символов и знак "минус". Далее полученную строку конвертнуть обратно в число ... "обманув" ... и разделитель тысяч, и десятичную точку (запятую):
... и окончательный вариант "обмана" выглядит так (без предыдущего, возможно кого-то пугающего, деления на 100):
X++:
static void Job173(Args _args)
{
    real a = 123456.78;
    str  strNumberAfterStrFmt = strFmt('%1', a);
    real b;
    boolean c;
    ;

    b = str2Num(
        strFmt ( '%1e-2',
        strKeep( strNumberAfterStrFmt, '-0123456789')));

    c = a == b;
    box::info(strFmt('%1\n\n%2\n\n%3',
        strFmt('Исходное число: %1', a),
        strFmt('Восстановленное число из строки: %1', b),
        strFmt('Исходное число равно числу из строки?: %1', c)));
}
P.S.
В процессе эксперимента обратил внимание на то, что региональные настройки Аксапта считывает при старте приложения и далее в текущей сессии их не меняет (!) даже при изменении региональных настроек в панели управления. Такое поведение Аксапты отличается, например, от поведения Excel, где при смене локали c Russian на English (United States) наглядно видно, как в ячейке тут же меняются разделители тысяч с пробелов на запятые.

Последний раз редактировалось Gustav; 30.04.2009 в 09:42.
За это сообщение автора поблагодарили: aidsua (1).
Старый 30.04.2009, 09:33   #22  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Gustav Посмотреть сообщение
этот пост был к следующему:
...
2. Я же говорил о ThousandsSeparator, что он тоже может быть ЗАПЯТОЙ (например, это стандартный разделитель у американцев).
...
Неправильно Вас понял, извиняюсь
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: Gustav (1).
Старый 30.04.2009, 15:09   #23  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Gustav

С целыми числами будет ошибка. StrFmt() в этом случае не создает дробной части. Получается лишнее деление на 100.

Хотя, я не теряю надежды услышать РЕАЛЬНУЮ постановку задачи от автора темы
Старый 30.04.2009, 15:26   #24  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
С целыми числами будет ошибка. StrFmt() в этом случае не создает дробной части. Получается лишнее деление на 100.
Это да. Про целые я уже сделал оговорку выше:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Если исходное число целое, то его можно по ходу без напряжения превратить в real, сложив с 0. или умножив на 1. (точки важны!) или разделить на 1 (можно без точки):
X++:
int a = 1000000;

strFmt('%1', a + 0.) // или
strFmt('%1', a * 1.) // или
strFmt('%1', a / 1 ) // хоть по теории это и самый долгий вариант, 
                     // зато без точки :)
но вроде круг ограничивается real'ами, т.к. упоминается семейство отчетов RLedgerSheet*:
Цитата:
Сообщение от valentino Посмотреть сообщение
Речь идет о семействе отчетов RLedgerSheet* которые отображают формочку с ListView, а в нем отображаются цифры преобразованные в строки.
Т.е. real'ные ДЕНЬГИ! ДЕНЬГИ!

P.S.
Ну, впрочем, можно и допилить слегка, правда, в этом случае появляется зависимость еще и от исходного числа, а не только от промежуточной строки (бррр! бред какой-то! ):
X++:
    b = str2Num(
            strFmt ( '%1e-%2',
                strKeep( strNumberAfterStrFmt, '-0123456789'),
                typeOf(a) == Types::Real ? 2 : 0
            ));

Последний раз редактировалось Gustav; 30.04.2009 в 15:48.
Старый 30.04.2009, 15:37   #25  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Мы опять упираемся в ПОСТАНОВКУ задачи.

Вот нафига конвертировать в строку, чтобы потом опять конвертировать в число. Причем еще неизвестно где, по непонятным причинам, пока это была строка произошла замена пробела на неразрывный пробел.

Может проще сразу число прочитать?
Старый 30.04.2009, 17:33   #26  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Может проще сразу число прочитать?
Я примерно представляю, о чем может идти речь.

Например, об этом: Главная Книга \Запросы \Оборот по счету \Анализ счета. После задания параметров и кнопки ОК выводится форма "Анализ счета", в которой в колонках "Дебит" и "Кредит" как раз суммы в текстовом виде, с которыми мы боремся.

Суммы превращаются в текст в методе insertRow класса RLedgerSheetEngine_AccountReview:
X++:
amount = ledgerTransDebit.exists(rowAccount) ? ledgerTransDebit.lookup(rowAccount) : 0;
formListItem = new FormListItem(strRfix(strFmt("%1", amount), amountDictType.displayLength()));
...
amount = ledgerTransCredit.exists(rowAccount) ? ledgerTransCredit.lookup(rowAccount) : 0;
formListItem = new FormListItem(strRfix(strFmt("%1", amount), amountDictType.displayLength()));
где ledgerTransDebit и ledgerTransCredit - мэпы вида map(typeOf(LedgerAccount), typeof(initialBalance)).

Чтобы получить сумму в первозданном виде, например, при щелчке по строке списка нужно будет считать из нее номер счета, выбрать мэп (дебитовый или кредитовый) и получить сумму при помощи map.lookup.

Последний раз редактировалось Gustav; 30.04.2009 в 17:35.
За это сообщение автора поблагодарили: valentino (1).
Старый 04.05.2009, 15:12   #27  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Я бы просто записал число "как есть" в соответствующий Item

X++:
formListItem.Data(amount);
А потом, также, "как есть" и прочитал бы.

X++:
print formListItem.Data();
Ведь требования к отображению данных могут предъявляться самые разные. Например, округлять до тысяч, или отображать название валюты. И что, менять алгоритмы разбора строки?
Старый 05.05.2009, 14:07   #28  
valentino is offline
valentino
Участник
Аватар для valentino
 
33 / 11 (1) +
Регистрация: 14.02.2007
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Мы опять упираемся в ПОСТАНОВКУ задачи.
Владимир, если Вы внимательно будете читать все топики данной темы сначала, то постановка задачи станет Вам ясна.
Gustav абсолютно точно ее понял.
Вообще, я надеялся, что кто-то подскажет почему Аксапта при преобразовании из числа в строку втыкает тысячным разделителем обычный пробел (32) а не знак разделителя из панели управления (160) (я думал где-то есть тайные настройки).
Но, в принципе считаю тему исчерпанной.
Спасибо всем!
Старый 05.05.2009, 15:55   #29  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от valentino Посмотреть сообщение
Вообще, я надеялся, что кто-то подскажет почему Аксапта при преобразовании из числа в строку втыкает тысячным разделителем обычный пробел (32) а не знак разделителя из панели управления (160) (я думал где-то есть тайные настройки).
В процессе шаманских плясок вокруг функции strFmt созрела такая гипотеза. Конечно, не более, чем предположение (исходного кода функции я не видел). Заключается гипотеза в следующем.

Функция strFmt ведёт себя похоже на функции num2str и date2str. Похожесть заключается в числе прочего и в том, что в качестве разделителей (десятичных, тысяч, элементов даты) используются только разделители, "регламентированные" этими двумя функциями. Так разделителем тысяч в функции num2str может быть точка, запятая, ничего (пустая строка) или пробел, который с кодом 32. Поробуйте поставить в региональных настройках в качестве разделителя тысяч, скажем, букву x (икс латинская) - strFmt все равно будет использовать один из 4-х доступных разделителей - не могу сказать с уверенностью, какой именно - для какого "нерегламентированного" символа.

Таким образом, согласно моей гипотезе, нерегламентированный пробел с кодом 160 "неудачно" заменяется на "регламентированный" пробел с кодом 32 - просто как на один из 4-х возможных вариантов, зашитых в функцию, вводя нас в заблуждение. Т.е. проблема существует, но корни, похоже, у нее совсем другие, чем просто "неряшливость" разработчиков функции strFmt.

Видимо, можно говорить о том, что функция strFmt следует за региональными настройками только пока региональные настройки находятся с ней в "хорошем согласии" (совпадают разделители и проч.), позволяющем не замечать отклонений. К счастью, большинство настроек, находятся в хорошем согласии, а экспериментаторов, ставящих x в качестве разделителя тысяч не так много Впрочем, если есть желание, присоединяйтесь к исследованию!
Теги
разделитель тысячных, axapta

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разделитель страницы в MS WORD FiGr DAX: Программирование 3 14.05.2007 15:24
Разделитель десятичных знаков в отчетах dirigente DAX: Функционал 0 20.11.2003 12:28

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:38.