Miklix

Перетворення дійсного рядка з усіма десятковими дробами в Dynamics AX 2012

Опубліковано: 16 лютого 2025 р. о 10:41:03 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 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.