28.06.2007, 17:13 | #1 |
Участник
|
как получить нужное значение из такого ?
Есть значение зк1234567/1P1,
как получить с этого значения 1234567/1, то есть обрезать вначале буквы и в конце буквы и всё что после них? |
|
28.06.2007, 17:21 | #2 |
Участник
|
Я бы, наверное воспользовался str StrRem (str text1,str text2) (описание есть в SystemDocumentation/Functions)
|
|
28.06.2007, 17:22 | #3 |
Участник
|
|
|
28.06.2007, 17:25 | #4 |
Участник
|
Если речь идет о Ax4 я бы написал регулярное выражение
|
|
28.06.2007, 17:26 | #5 |
Участник
|
|
|
28.06.2007, 17:31 | #6 |
Участник
|
|
|
28.06.2007, 17:34 | #7 |
Участник
|
|
|
28.06.2007, 17:41 | #8 |
Участник
|
А так не подойдет:
s - исходная строка X++: int pos = strfind(s, 'P',1, strlen(s)); str s1 = substr(s,1,pos-1); str s2 = substr(s,pos+1, strlen(s)-pos-1); |
|
28.06.2007, 18:24 | #9 |
Участник
|
X++: //returns true if needed char found in _str boolean IsStrOk(str 100 _str) { if (strfind(_str,'0123456789/',1,strlen(_str))) return(true); else return(false); } While (Cnt <= strlen(str_to_parse)) { if ( IsStrOk(SubStr(str_to_parse,Cnt,1))) { str_to_receive = str_to_receive + SubStr(str_to_parse,Cnt,1); // здесь надо ставить break; на знак Р или любой другой закачивающий разбор строки. } Cnt++; } З.Ы. переделано на скорую руку из старого проекта, прошу сильно не бить) Последний раз редактировалось Akinak; 28.06.2007 в 18:34. |
|
28.06.2007, 18:27 | #10 |
Участник
|
Цитата:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число? 2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка? 3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым? 3) в конечном наборе буква всегда одна, или их может быть две и больше ? 4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ? 5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ? Если подходить формально, решая задачу именно так, как она вами записана, то это так: X++: S2 = substr(S1,3,9) Последний раз редактировалось Zuzaz; 28.06.2007 в 18:31. |
|
28.06.2007, 18:30 | #11 |
Member
|
Первое, что приходит на ум в конце рабочего дня — организовать цикл по строке с начала в конец, перебирая символы по одному. Запомнить позицию первого правильного, и первого неправильного, который следует после правильного. Потом вырезать подстроку. Функции для определения того, правильный символ или нет в Аксапте есть, и достаточно удобные.
__________________
С уважением, glibs® |
|
28.06.2007, 18:36 | #12 |
Участник
|
glibs, функции-то конечно есть, но для этого нужно четка знать критерии, которые этими функциями будут проверяться. Пока этого нет. Если формат четко такой, как в примере, т.е. 2 буквы вначале и затем 9 знаков номера, то и никакой перебор с проверками не нужен.
|
|
28.06.2007, 18:37 | #13 |
Moderator
|
Цитата:
6) задача разовая или постоянная? (честно говоря, если постоянная, то тогда, как поется в одной бардовской песне, "просто дыбом волоса" от проектирования...) 7) можно ли решить ее вне Аксапты (например, в Excel'е) ? Цитата:
X++: [strDO, strPOSLE] = str2con_ru('зк1234567/1P1', 'P'); X++: { str str0, strDO, strPOSLE; ; [strDO, strPOSLE] = str2con_ru( 'зк1234567/1P1', 'P' ); [str0 , strDO ] = str2con_ru( strDO , 'зк'); info(strDO + ' --- ' + strPOSLE); } Последний раз редактировалось Gustav; 29.06.2007 в 08:52. Причина: добавил второй фрагмент кода |
|
29.06.2007, 08:27 | #14 |
Пенсионер
|
Может это поможет:
X++: container str2con_MY(str _string, str _separator = ",", boolean _multiSeparator = False) { container con; int pos, oldPos = 1; str strTemp1; str symbol; ; if(_multiSeparator) { do { symbol = subStr(_string, oldPos, 1); if(strfind(_separator,symbol,1,strlen(_separator)) || !symbol) { con += strTemp1; strTemp1 = ""; } else { strTemp1 = strTemp1 + symbol; } oldPos++; } while (symbol); } else { do { pos = strScan(_string, _separator, pos ? pos + strLen(_separator) : 1, strLen(_string)); con += subStr(_string, oldPos, pos ? pos - oldPos : strLen(_string) + 1 - oldPos); oldPos = pos + strLen(_separator); } while (pos); } return con; } Пример вызова например так: X++: str2con_MY("зк1234567/1P1", "зк/P", True)
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
29.06.2007, 09:09 | #15 |
Участник
|
Цитата:
Сообщение от Zuzaz
Как часто случается, это задание недостаточно формализовано. Без уточнения ряда вопросов по формату номера предлагать варианты бесполезно:
1) вначале всегда идут буквы ? их всегда две, как в примере, или может быть любое число? 2) между начальным и конечным набором букв цифры всегда идут со слешем, или могут быть только цифры ? Могут ли вместо слеша быть и другие знаки, например тире или точка? 3) количество знаков между первым и конечным набором букв всегда одинаково, или может быть любым? 3) в конечном наборе буква всегда одна, или их может быть две и больше ? 4) в конечном наборе всегда идут буквы и потом цифры, или могут быть другие варианты (например, только буквы;буквы, цифры и снова буквы) ? Сколько цифр может быть после последней буквы ? 5) и наконец ключевой вопрос: зачем нужно такое преобразование, какая исходная постановка задачи? Может быть, исходная задача решается другим, более простым способом ? Или может быть, исходная задача такова, что и ваш способ с преобразованием номера её не решит ? Если подходить формально, решая задачу именно так, как она вами записана, то это так: X++: S2 = substr(S1,3,9) 2. Далее идут цифры (тоже непонятно сколько ) разделение слеш и ещё несколько цифр... вот в первый заход их нужно получить. 3. Потом идёт буква Р после неё цифры. Второе значение у меня должно как раз ему равнятся... то есть если первоначально было ППРРВ12345/45Р5, то должно получится два значения: первое 12345/45 и второе 5 |
|
29.06.2007, 09:10 | #16 |
Участник
|
[quote=Gustav;142376]я бы к этому совершенно справедливому списку добавил еще пару оргвопросов:
6) задача разовая или постоянная? (честно говоря, если постоянная, то тогда, как поется в одной бардовской песне, "просто дыбом волоса" от проектирования...) 7) можно ли решить ее вне Аксапты (например, в Excel'е) ? quote] задача постояная и решится должна только в АХ.. |
|
29.06.2007, 09:16 | #17 |
Участник
|
Цитата:
X++: s1 = strkeep(s1, '1234567890/'); P.S. Согласен с Gustav, делить строку с помощью str2con_RU более оптимальный вариант |
|
29.06.2007, 09:21 | #18 |
Moderator
|
|
|
29.06.2007, 09:34 | #19 |
Участник
|
Цитата:
а ещё маленький вопрос как впереди первого значения поставить "*" ? то есть формируется у меня номер например накладной.. X++: modifSalesPickingListId = strRem(SalesPickingListJournalTable.SalesId, 'зсчЗКП'); //обрезаем символы заказа и закупки modifSalesPickingListId = modifSalesPickingListId + '/' + pickingId; мне казалось , J - это '*', или я что-то путаю? Последний раз редактировалось fialka; 29.06.2007 в 09:39. |
|
29.06.2007, 09:42 | #20 |
Moderator
|
|
|