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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.05.2017, 16:14   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
667 / 511 (19) +++++++
Регистрация: 14.10.2004
Символ с кодом 160 в качестве пробела
Столкнулся с тем, что некоторые системы, например, SAP или 1C версии 7.7 выгружают числа типа 5555 в обычные текстовые файлы или в Эксель в виде строки "5 555", в которой в качестве разделителя используется не пробел, а символ с ASCII-кодом 160.
В результате, когда в Аксапте надо строку обратно преобразовать в число, приходится писать целые функции.
Есть ли какой-нибудь простой способ получить из строки "55 555,55" число в Аксапте 55555.55 ?
Я делаю так:
X++:
    str normalizeNum(str _s)
    {
        int n;
        str ret;
        ;
        for (n = 1; n <= strLen(_s); n++)
        {
            if (char2num(_s, n) != 160)
                ret += subStr(_s, n, 1);
        }
        return strrem(ret, " ");
    }
    ;

    strSum = strreplace("55 555,55", ",", ".");
    strSum = normalizeNum(strSum);
    realSum = str2num(strSum);
Старый 03.05.2017, 16:28   #2  
BIDeveloper is offline
BIDeveloper
Участник
 
16 / 11 (1) +
Регистрация: 27.11.2016
Почему бы вместо этой функции второй раз strreplace не сделать - заменить символ 160 на пустоту?
Старый 03.05.2017, 16:33   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
667 / 511 (19) +++++++
Регистрация: 14.10.2004
Не хочется все время помнить про символ с кодом 160.
Несколько раз в год возникают задачи по интеграции, в которых такая штука может встретиться, и не хочется все время вспоминать про магическое число 160.
Хотелось бы, чтобы функция str2num или какая-то другая стандартная функция сама умела это делать.
Старый 03.05.2017, 16:35   #4  
online
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,471 / 3148 (145) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
а символ с ASCII-кодом 160.
Это неразрывный пробел.

Из-за работы со сборщиком мусора, в аксапте предпочтительнее обходится встроенными функциями вместо циклов на языке. даже в CIL.

поэтому вместо normalizeNum() лучше использовать встроенную strRem
https://msdn.microsoft.com/en-us/library/aa629339.aspx

но еще лучше воспользоваться функцией strKeep() для чисел
https://msdn.microsoft.com/en-us/library/aa867746.aspx
strkeep(s, "01234567890,.E+-")

стоит также посмотреть на formattedstr2num
https://msdn.microsoft.com/en-us/library/cc570788.aspx
но я не уверен, что эта функция нормально работает с неразрывным пробелом
__________________
Facebook, mazzy.priot, mazzy.music, coub.
За это сообщение автора поблагодарили: Ace of Database (3).
Старый 03.05.2017, 16:39   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
667 / 511 (19) +++++++
Регистрация: 14.10.2004
Спасибо!
strkeep(s, "01234567890,.E+-") - как раз то, что надо.
Старый 03.05.2017, 16:49   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
667 / 511 (19) +++++++
Регистрация: 14.10.2004
На память оставлю, чтобы потом залезть и посмотреть
X++:
static void Job388(Args _args)
{
    str s = " 5  555, 55 ";
    real r;
    ;
    r = str2Num(strreplace(strkeep(s, "01234567890,.E+-"), ",", "."));
    info(strfmt("%1", r));

}
За это сообщение автора поблагодарили: mazzy (2).
Старый 03.05.2017, 17:35   #7  
online
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
Most Valuable Professional
 
20,471 / 3148 (145) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
ну... в некоторых странах запятая используется как разделитель разрядов.
так что в общем случае нужно чуть тщательнее.
но в данном конкретном случае вполне пойдет.

для исследований стоит также заглянуть в Global::str2numOk и в Global::str2intOk.
там народ вообще через регулярку проверяет.
но если уж через interop, то можно использовать нормальные функции преобразования с учетом cultural context из .net
__________________
Facebook, mazzy.priot, mazzy.music, coub.
За это сообщение автора поблагодарили: Logger (1).
Старый 03.05.2017, 18:57   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,324 / 807 (29) +++++++
Регистрация: 13.01.2004
В общем случае, задача конвертации строки в число - не имеет решения. Преобразование всегда будет только для конкретных (локальных, частных) условий. Только если точно знать, в каком формате ожидать символьную строку для преобразования

Например, даже по приведенному коду можем получить не корректное преобразование в зависимости от формата строки

info(strFmt('%1', str2num('1e+5'))); // Не корректное преобразование
info(strFmt('%1', str2num('1.0e+5'))); // Корректное преобразование

А по поводу "некоторых стран", некоторые бухгалтера в качестве разделителя целой и дробной части числа используют дефис (минус)

info(strFmt('%1', str2num('123-45')));

Это "переводится" не 123 минус 45, а 123 руб 45 коп
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: mazzy (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Capturing an AX User’s SQL SPID over multiple AOS servers in AX 2009 Blog bot DAX Blogs 0 16.05.2013 19:11
emeadaxsupport: AX for Retail 2012: Customizing the Transaction Service Blog bot DAX Blogs 0 19.04.2012 01:14
sumitsaxfactor: Getting Ledger transactions in Ax 2012 Blog bot DAX Blogs 0 13.12.2011 22:11
sumitsaxfactor: Browsing Folders for Files on 64-bit Server Side Implementation (Batch Run) Blog bot DAX Blogs 0 26.08.2011 01:13
emeadaxsupport: How can the Web Proxies get extended programmatically? Blog bot DAX Blogs 0 16.12.2009 18:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:22.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.