как БЫСТРО отбросить префикс и получить номер (число), не зная длину префикса? #528371


#0 by Fragster
Типа как регулярное выражение (d+)$ (самой регуляркой через COM таки не катит, потому что может выполнятся на сервере под никсами)
#1 by Fragster
ну да, перебор строки с конца - очевидный вариант, но может есть способ быстрее?
#2 by Ненавижу 1С
Непонятно, в случае АБ00256 нужно 00256 или просто 256?
#3 by СноваЗдорова
какая база?
#4 by IamAlexy
заюзать типовую функцию подготовки номера для печати из любой типовой
#5 by СноваЗдорова
какая платформа?
#6 by IamAlexy
правда - показательный пример... вот нужно оставить с нулем - фиг оставит
#7 by СноваЗдорова
ага - ПодготовитьНОмерДляПечати вроде
#8 by СноваЗдорова
нули пририсовать =)
#9 by Fragster
нужно получить число, т.е. 256
#10 by Fragster
8.1
#11 by IamAlexy
только там прикол.. допустим у вас хитро0пый номер и там дата и месяц стоят в префиксе... типа 0120/00001 тогда на печать уползет соответственно 120/00001 :) а в декабре будет соответственно 1120/000001 то есть типа некрасиво :)
#12 by Fragster
а БЫСТРО - это потому что количество обрабатываемых строк будет до 100000 на документ (серийные номера) :(
#13 by Fragster
+ хочу в базу писать: префикс такой-то, начальный номер такой-то, количество такое-то
#14 by IamAlexy
быстро это когда у тебя есть префикс заранее известной длины и ты просто через ПРАВ его отсекаешь.
#15 by Fragster
скажи это поставщикам
#16 by Stepa86
Префикс всегда непредсказуем? если можно получить быстро префикс для хотя бы половины, то можно делать , для кого это не проканало, план Б (например как )... Ну и в первую очередь попробовать регекспом обработать, вдруг доступен... Если много повторений, то можно еще структуру заюзать в качестве кеша, но надо еще оценить будет ли выигрыш
#17 by smaharbA
//******************************************* Процедура Сформировать    Стр="АБ00256";    Для Сч=0 По 9 Цикл        Знак=Найти(Стр,Сч);        Если (Знак>1) Тогда            Код=Сред(Стр,Знак-1);            Если КодСимв(Код)>57 Тогда                Сообщить(Число(Сред(Код,2)));            ИначеЕсли КодСимв(Код)<48 Тогда                Сообщить(Число(Сред(Код,2)));            КонецЕсли;        КонецЕсли;    КонецЦикла; КонецПроцедуры
#18 by smaharbA
пля, когда вернут тэги взад ?
#19 by smaharbA
А почему секция не адинес ?
#20 by andrewks
кусать цифири справа до тех, пока не встретим нецифровой литерал, затем - преобразование типа
#21 by trdm
[1C] Функция глВыделитьПрефиксНомера( псНомер, псОстЧисло = "" ) Экспорт    ЗначВозврата= "";    вНомерСтар    = СокрЛП(псНомер);    псОстЧисло = "";        вНомерНов    = "";    СЦ = 0; вЕщеЧисло = 1;    Для СЦ = 1 По СтрДлина(вНомерСтар) Цикл        вСимвол = Сред(вНомерСтар,СтрДлина(вНомерСтар)-СЦ+1,1);        вСмещение = КодСимв("9") - КодСимв(вСимвол);        Если вЕщеЧисло = 1 Тогда            Если (вСмещение <= 9) И (вСмещение >= 0)   Тогда                псОстЧисло = вСимвол + псОстЧисло;            Иначе                вЕщеЧисло = 0;            КонецЕсли;        КонецЕсли;        Если вЕщеЧисло = 0 Тогда            ЗначВозврата = вСимвол + ЗначВозврата;        КонецЕсли;    КонецЦикла;    Возврат ЗначВозврата; КонецФункции // глВыделитьПрефиксНомера [/1C]
#22 by trdm
А так?
#23 by Fragster
эээ? 0123456789аб123?
#24 by smaharbA
0123456789аб123
#25 by МихаилМ
Выложите файл с примерами желательно тысяч 10
#26 by smaharbA
в ТЗ вроде бы речь о префиксе, а в "аб" - так понимаю не префикс
#27 by Fragster
в префикс 0123456789аб
#28 by smaharbA
[1C] //******************************************* Процедура НомерБезПрефикса(Стр)    Для Сч=0 По 9 Цикл        Знак=Найти(Стр,Сч);        Если (Знак>1) Тогда            Код=КодСимв(Сред(Стр,Знак-1));            Если Код>57 Тогда                Стр=Число(Сред(Стр,Знак));                Прервать;            ИначеЕсли Код<48 Тогда                Стр=Число(Сред(Стр,Знак));                Прервать;            КонецЕсли;        КонецЕсли;    КонецЦикла; КонецПроцедуры Процедура Сформировать    Стр="АБ00256";    НомерБезПрефикса(Стр);    Сообщить(Стр);    Стр="0123456789аб123";    НомерБезПрефикса(Стр);    Сообщить(Стр); КонецПроцедуры    // Сформировать [/1C]
#29 by smaharbA
Без первых буков тэг не работает ?
#30 by МихаилМ
пребирайте посимвольно и сравнивайте на > предврительно статистически (коли 100 тысяч) оцените размер префикса и размер строки и сответственно перебирайте с расчитанной статистически позиции незабывайте, что на сервере можно исполнить фоновые задания те распараллеить вычисления. если исходныйе данные хранятся в бд. то, учитывая жуткую тормознутость 1с8, может оказаться целесобразным даное преоразование совершить запросом на сервере бд. либо распаралелить часть считать на клиент (сервер 1с) часть расчитать на сервере субд
#31 by smaharbA
???
#32 by МихаилМ
КодСимв и сред лишнии ресурсоемкие операции просто сравнивать с "9"  и "0"
#33 by smaharbA
проверено - быстрее преобразовать чем сравнивать строки
#34 by smaharbA
и Сред быстрее чем Лев/Прав (не уверен - кажется не логичным, но вроде проверял как то)
#35 by smaharbA
и еще - быстрее процедура с параметром по ссылке, чем функция с возвратом
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям