Miklix

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

Опубликовано: 16 февраля 2025 г. в 10:40:54 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-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.