30.04.2009, 09:28 | #21 |
Moderator
|
Попробую еще раз.
МОЕ ПОНИМАНИЕ ПРОБЛЕМЫ: Цитата:
Цитата:
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))); } В процессе эксперимента обратил внимание на то, что региональные настройки Аксапта считывает при старте приложения и далее в текущей сессии их не меняет (!) даже при изменении региональных настроек в панели управления. Такое поведение Аксапты отличается, например, от поведения Excel, где при смене локали c Russian на English (United States) наглядно видно, как в ячейке тут же меняются разделители тысяч с пробелов на запятые. Последний раз редактировалось Gustav; 30.04.2009 в 09:42. |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
30.04.2009, 09:33 | #22 |
Ищущий знания...
|
Неправильно Вас понял, извиняюсь
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: Gustav (1). |
30.04.2009, 15:09 | #23 |
Участник
|
Gustav
С целыми числами будет ошибка. StrFmt() в этом случае не создает дробной части. Получается лишнее деление на 100. Хотя, я не теряю надежды услышать РЕАЛЬНУЮ постановку задачи от автора темы |
|
30.04.2009, 15:26 | #24 |
Moderator
|
Цитата:
Цитата:
Сообщение от Gustav
Если исходное число целое, то его можно по ходу без напряжения превратить в real, сложив с 0. или умножив на 1. (точки важны!) или разделить на 1 (можно без точки):
X++: int a = 1000000; strFmt('%1', a + 0.) // или strFmt('%1', a * 1.) // или strFmt('%1', a / 1 ) // хоть по теории это и самый долгий вариант, // зато без точки :) Цитата:
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 |
Участник
|
Мы опять упираемся в ПОСТАНОВКУ задачи.
Вот нафига конвертировать в строку, чтобы потом опять конвертировать в число. Причем еще неизвестно где, по непонятным причинам, пока это была строка произошла замена пробела на неразрывный пробел. Может проще сразу число прочитать? |
|
30.04.2009, 17:33 | #26 |
Moderator
|
Я примерно представляю, о чем может идти речь.
Например, об этом: Главная Книга \Запросы \Оборот по счету \Анализ счета. После задания параметров и кнопки ОК выводится форма "Анализ счета", в которой в колонках "Дебит" и "Кредит" как раз суммы в текстовом виде, с которыми мы боремся. Суммы превращаются в текст в методе 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())); Чтобы получить сумму в первозданном виде, например, при щелчке по строке списка нужно будет считать из нее номер счета, выбрать мэп (дебитовый или кредитовый) и получить сумму при помощи map.lookup. Последний раз редактировалось Gustav; 30.04.2009 в 17:35. |
|
|
За это сообщение автора поблагодарили: valentino (1). |
04.05.2009, 15:12 | #27 |
Участник
|
Я бы просто записал число "как есть" в соответствующий Item
X++: formListItem.Data(amount); X++: print formListItem.Data(); |
|
05.05.2009, 14:07 | #28 |
Участник
|
Владимир, если Вы внимательно будете читать все топики данной темы сначала, то постановка задачи станет Вам ясна.
Gustav абсолютно точно ее понял. Вообще, я надеялся, что кто-то подскажет почему Аксапта при преобразовании из числа в строку втыкает тысячным разделителем обычный пробел (32) а не знак разделителя из панели управления (160) (я думал где-то есть тайные настройки). Но, в принципе считаю тему исчерпанной. Спасибо всем! |
|
05.05.2009, 15:55 | #29 |
Moderator
|
Цитата:
Функция strFmt ведёт себя похоже на функции num2str и date2str. Похожесть заключается в числе прочего и в том, что в качестве разделителей (десятичных, тысяч, элементов даты) используются только разделители, "регламентированные" этими двумя функциями. Так разделителем тысяч в функции num2str может быть точка, запятая, ничего (пустая строка) или пробел, который с кодом 32. Поробуйте поставить в региональных настройках в качестве разделителя тысяч, скажем, букву x (икс латинская) - strFmt все равно будет использовать один из 4-х доступных разделителей - не могу сказать с уверенностью, какой именно - для какого "нерегламентированного" символа. Таким образом, согласно моей гипотезе, нерегламентированный пробел с кодом 160 "неудачно" заменяется на "регламентированный" пробел с кодом 32 - просто как на один из 4-х возможных вариантов, зашитых в функцию, вводя нас в заблуждение. Т.е. проблема существует, но корни, похоже, у нее совсем другие, чем просто "неряшливость" разработчиков функции strFmt. Видимо, можно говорить о том, что функция strFmt следует за региональными настройками только пока региональные настройки находятся с ней в "хорошем согласии" (совпадают разделители и проч.), позволяющем не замечать отклонений. К счастью, большинство настроек, находятся в хорошем согласии, а экспериментаторов, ставящих x в качестве разделителя тысяч не так много Впрочем, если есть желание, присоединяйтесь к исследованию! |
|
Теги |
разделитель тысячных, axapta |
|
Похожие темы | ||||
Тема | Ответов | |||
Разделитель страницы в MS WORD | 3 | |||
Разделитель десятичных знаков в отчетах | 0 |
|