|  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 | |
|  |