Miklix

Преобразование вещественного числа в строку со всеми десятичными знаками в Dynamics AX 2012

Опубликовано: 16 февраля 2025 г. в 10:40:54 UTC
Последнее обновление: 12 января 2026 г. в 08:50:58 UTC

В этой статье я объясняю, как преобразовать число с плавающей запятой в строку, сохранив при этом все десятичные знаки, в Dynamics AX 2012, включая пример кода на X++.


Эта страница была переведена с английского языка для того, чтобы сделать ее доступной как можно большему числу людей. К сожалению, машинный перевод еще не является совершенной технологией, поэтому возможны ошибки. Если вы хотите, вы можете просмотреть оригинальную английскую версию здесь:

Convert a Real to String with All Decimals in Dynamics AX 2012

Информация в этом сообщении основана на Dynamics AX 2012 R3. Она может быть или не быть актуальна для других версий.

Время от времени мне нужно преобразовать действительное число в строку. Обычно достаточно просто передать его функции strFmt(), но эта функция всегда округляет до двух десятичных знаков, что не всегда мне нужно.

Затем есть функция num2str(), которая хорошо работает, но требует предварительного знания количества десятичных знаков и символов.

А что, если вам нужно просто преобразовать число в строку со всеми цифрами и десятичными знаками? Почему-то это всегда заставляет меня гуглить, потому что это удивительно неочевидный способ, и я делаю это так редко, что обычно не могу точно вспомнить, как это делается — в большинстве языков программирования я ожидал бы, что можно просто объединить число с пустой строкой, но X++ этого не поддерживает.

В любом случае, самый простой способ, который я нашел, — это использовать вызов .NET. Здесь тоже есть несколько вариантов, с опциями расширенного форматирования и без них, но если вам просто нужно очень простое преобразование вещественного числа в строку, этого будет достаточно:

stringValue = System.Convert::ToString(realValue);

Если этот код должен выполняться на AOS (например, в пакетном задании), не забудьте сначала получить необходимые права доступа к коду. В этом случае вам потребуется разрешение InteropPermission типа ClrInterop для вызова кода .NET, поэтому полный пример кода будет выглядеть примерно так:

new InteropPermission(InteropKind::ClrInterop).assert();
stringValue = System.Convert::ToString(realValue);
CodeAccessPermission::revertAssert();

Обратите внимание, что эта простая функция System::Convert использует текущие локали системы в отношении символа десятичной точки. Для вас это может не быть проблемой, но для меня, живущего в регионе, где в качестве десятичного разделителя используется запятая, а не точка, может потребоваться дополнительная обработка, если, например, строку необходимо использовать в файле, который должен быть читаемым другими системами.

Дополнительное чтение

Если вам понравился этот пост, вам также могут понравиться эти предложения:


Поделиться на BlueskyПоделиться на FacebookПоделиться на LinkedInПоделиться на TumblrПоделиться на XПоделиться на LinkedInЗакрепить на Pinterest

Миккель Кристенсен

Об авторе

Миккель Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.