AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 06.09.2004, 10:53   #1  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Join Date: 02.09.2004
Символ в строке
Есть строка

,,Казань,,Татарстан,11,,38

Надо из нее выдернуть город (после двух запятых), улицу (после 4-х запятых) и т.д.
У меня есть алгоритм, но чтобы он заработал мне нужен доступ к отдельному символу строки, как если бы она была массивом.. Таких функций в аксапте я не нашел (может плохо искал).. Есть идеи?
Old 06.09.2004, 11:19   #3  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Join Date: 02.09.2004
это мой старый топик
Но в нем нет ответа на мой новый вопрос..
Old 06.09.2004, 11:32   #4  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Join Date: 16.05.2002
PHP Code:
street conpeek(con2str(AddressString),3
Old 06.09.2004, 11:53   #5  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Join Date: 23.07.2004
Location: г. Новокузнецк
Quote:
Изначально опубликовано Lexey
PHP Code:
street conpeek(con2str(AddressString),3
Гхм... давайте уже без извращений, всё проще и производительнее:

substr( stree, n, 1 )

(в аксапте как и в бейсике нет символьного типа данных (char), за символ достаточно принять строку с длиной 1)
Old 06.09.2004, 11:55   #6  
YVAS is offline
YVAS
1C
YVAS's Avatar
1C
 
265 / 10 (1) +
Join Date: 31.07.2003
А разве строка не есть массив символов?
PHP Code:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
Old 06.09.2004, 12:13   #7  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Join Date: 16.05.2002
Quote:
Изначально опубликовано Alks


Гхм... давайте уже без извращений, всё проще и производительнее:

Давайте. Цифирки n и 1 как будем искать? Напомню - задача стояла ''выдернуть город (после двух запятых), улицу (после 4-х запятых) ".
Old 06.09.2004, 12:22   #8  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Join Date: 23.07.2004
Location: г. Новокузнецк
Quote:
Изначально опубликовано YVAS
А разве строка не есть массив символов?
PHP Code:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
Результат - сообщение компилятора об ошибка "переменная не является массивом".
Old 06.09.2004, 12:22   #9  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Quote:
Изначально опубликовано YVAS
А разве строка не есть массив символов?
PHP Code:
str string;

string "пример";
info(string[2]); 
Результат символ "р"
2 YVAS: И что, этот код работает??? Это же не С++...

2 Smith: Кроме приведенного здесь, посмотрите еще класс TextBuffer - там много вкусного, а также методы класса Global.

2 Lexey: Наверное, не con2str(), а str2con()?
__________________
Old 06.09.2004, 12:28   #10  
YVAS is offline
YVAS
1C
YVAS's Avatar
1C
 
265 / 10 (1) +
Join Date: 31.07.2003
2Ruff, Alks

Ребят спасибо, просто Аксапты под рукой нет. Проверить не могу.
Old 06.09.2004, 12:30   #11  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Join Date: 23.07.2004
Location: г. Новокузнецк
Quote:
Изначально опубликовано Lexey


Давайте. Цифирки n и 1 как будем искать? Напомню - задача стояла ''выдернуть город (после двух запятых), улицу (после 4-х запятых) ".
Извиняюсь, у вас просто ошибка - надо не con2str, а str2con было писать. И так действительно str2con решает задачу элегантно.
Old 06.09.2004, 12:57   #12  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Join Date: 27.11.2001
Location: Dubai, UAE
А зачем Вам вообще какой-то алгоритм? Есть прекрасный класс TextBuffer, который умеет работать с token'ами:
PHP Code:
textBuffer = new TextBuffer();
textBuffer.setText(",,Казань,,Татарстан,11,,38");
// AXAPTA не совсем правильно работает с пустыми
// токенами, поэтому от них надо сначала избавиться
textBuffer.regularExpressions(true);
textBuffer.replace(",,"",~,");
textBuffer.replace("<,""~,");
textBuffer.replace(",>"",~");
num 0;
while (
textBuffer.nextToken(false",")) {
    
num++;
    switch (
num) {
        case 
3:
            
info(strfmt("Город: %1"textBuffer.token()));
            break;
        case 
5:
            
info(strfmt("Улица: %1"textBuffer.token()));
            break;
    }

__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Old 06.09.2004, 13:03   #13  
Lexey is offline
Lexey
Участник
 
59 / 13 (1) ++
Join Date: 16.05.2002
Talking
Ну вот и разобрались
Old 06.09.2004, 13:56   #14  
Smith is offline
Smith
Участник
 
76 / 10 (1) +
Join Date: 02.09.2004
Спасибо!
Взял на вооружение наиболее простой и наглядный для меня способ из описанных здесь. Вот что получилось:
X++:
static void Job5(Args _args)
{
    str   sTmp, sS = ',,Казань,,Амирхана,31,2,89';
    int   zpt, i = 1;
    ;
    zpt = 0;
    while (i != StrLen(sS)+1)
    {
    if (subStr(sS, i, 1) != ',')
    {
        sTmp = sTmp + subStr(sS, i, 1);
    }
    else
    {
       zpt++;
       switch (zpt)
       {
            case 3: print('city ' + sTmp);break;
            case 5: print('street ' + sTmp);break;
            case 6: print('House ' + sTmp);break;
            case 7: print('Building ' + sTmp);break;
       }
       sTmp = '';
    }
//    print(subStr(sS, i, 1));
    i++;
    }
    print('Flat ' + sTmp);
    pause;
}
Работает и хорошо! Всем спасибо за ответы!
Old 06.09.2004, 14:22   #15  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
PHP Code:
conPeek(str2con_ru(",,Казань,,Татарстан,11,,38"), 3
Old 06.09.2004, 15:32   #16  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Re: Спасибо!
Quote:
Изначально опубликовано Smith
Взял на вооружение наиболее простой и наглядный для меня способ из описанных здесь. ... Работает и хорошо!
Простой и наглядный - это, конечно, хорошо, но правильный и универсальный - лучше . Я бы советовал Вам все же прислушаться к Максиму Горбунову (по его советам уже пора русскую редакцию Best Practices составлять ). Да и str2con() тоже выглядит попроще, чем цикл со свитчем.

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

Да, TextBuffer поначалу выглядит тяжеловато и громоздко, но как говорится "лучше день потерять, а потом за час долететь"!
__________________
Old 06.09.2004, 23:39   #17  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Re: Символ в строке
Quote:
Изначально опубликовано Smith
Есть строка

,,Казань,,Татарстан,11,,38

Надо из нее выдернуть город (после двух запятых), улицу (после 4-х запятых) и т.д.
Не, это программистский подход.

Без программирования задача должна ставится следующим образом: есть клиент - узнать из адреса его город и улицу. Адрес строится согласно адресного формата.

Теперь и только теперь в дело вступает программист.

Во-первых, не надо ничего программировать и ничего никуда переводить, не надо никаких строк.
Во-вторых, смотрим стандартный функционал. Есть map AddressMap. У него есть метод AddressMap.loadFields(). Этот метод возвращает контейнер [address, streetName, zipCodeId, city, countryId, stateId, countyId].
Вот и юзайте этот стандартный метод.

В сторону и про себя: вот бы локализаторы вместо того, чтобы городить свои мапы, нормально расширили бы станадртные...

Тогда вызов будут выглядеть так:
PHP Code:
Containter c;
custTable.AddressMap::loadFields()
infoconpeek(c4) ); // город
infoconpeek(c2) ); // улица 
Метод будет работать с ЛЮБЫМ адресным форматом!

Если же вы все такие поторопились и у вас есть только строка, то можно выкрутиться следующим образом - присвоить эту строку новой записи. Не забудьте указать страну.

PHP Code:
Container c;
CustTable custTable;
;
custTable.country 'RU'// укажите код России в вашей базе
custTable.address ", , , Казань, Татарстан, 11, , 38";
custTable.AddressMap::loadFields();
infoconpeek(c4) ); // город
infoconpeek(c2) ); // улица 
Обратите внимание, что строка должна полностью соответствовать адресному формату. Так у меня в качестве разделителей указана запятая с пробелом ", ". Поэтому в строке мне пришлось добавить пробелы и передвинуть Казань на четвертую позицию...
Tags
textbuffer, адресный формат, законченный пример, разбор строки

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
сумма по строке закупки Nikolaich DAX: Программирование 2 03.04.2007 13:37
Как достать символ из шрифта по коду ? DTD DAX: Программирование 1 01.02.2006 17:19
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02
Ловим \ в строке Smith DAX: Программирование 2 10.09.2004 16:09
Скидка по строке и многострочная скидка efim DAX: Функционал 0 18.06.2003 16:32

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 09:39.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.