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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.05.2017, 16:14   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
698 / 523 (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
Участник
 
23 / 11 (1) +
Регистрация: 27.11.2016
Почему бы вместо этой функции второй раз strreplace не сделать - заменить символ 160 на пустоту?
Старый 03.05.2017, 16:33   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
698 / 523 (19) +++++++
Регистрация: 14.10.2004
Не хочется все время помнить про символ с кодом 160.
Несколько раз в год возникают задачи по интеграции, в которых такая штука может встретиться, и не хочется все время вспоминать про магическое число 160.
Хотелось бы, чтобы функция str2num или какая-то другая стандартная функция сама умела это делать.
Старый 03.05.2017, 16:35   #4  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,619 / 3400 (171) ++++++++++
Регистрация: 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
но я не уверен, что эта функция нормально работает с неразрывным пробелом
__________________
GitHub, 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
 
698 / 523 (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
 
698 / 523 (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  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,619 / 3400 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
ну... в некоторых странах запятая используется как разделитель разрядов.
так что в общем случае нужно чуть тщательнее.
но в данном конкретном случае вполне пойдет.

для исследований стоит также заглянуть в Global::str2numOk и в Global::str2intOk.
там народ вообще через регулярку проверяет.
но если уж через interop, то можно использовать нормальные функции преобразования с учетом cultural context из .net
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
За это сообщение автора поблагодарили: Logger (1).
Старый 03.05.2017, 18:57   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,340 / 829 (30) +++++++
Регистрация: 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, время: 08:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.