InString с конца

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

InString с конца

Сообщение Андрей »

Че то не могу понять, InString c конца для русского языка не работает что ли ? Или я туплю и не мало....

Вот

Код: Выделить всё

l:Adres='ВасяПетяЖ.что'
len#=Len(Clip(l:Adres))
PosDom#=InString('Ж.',UPPER(Clip(l:Adres)),1,1)
message('PosDom#='&PosDom#&' len#='&len#)
Работает, возвращает 9

а

Код: Выделить всё

l:Adres='ВасяПетяЖ.что'
len#=Len(Clip(l:Adres))
PosDom#=InString('Ж.',UPPER(Clip(l:Adres)),-1,Len#)
message('PosDom#='&PosDom#&' len#='&len#)
0 возвращает

Clarion 10.0.0.12398
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

InString с конца

Сообщение Дед Пахом »

The only negative step value allowed is -1, and the search string must be 1 character long in this case. In other words, a negative step is not allowed with any substring greater than 1 character.
То есть 'Ж.' в поиске назад использовать нельзя.
С уважением, ДП
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

InString с конца

Сообщение Андрей »

а... вот оно шо....
Благодарю ! Не дочитал Help
kreator
✯ Ветеран ✯
Сообщения: 4984
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

InString с конца

Сообщение kreator »

Ищи просто "Ж", а потом проверяй наличие следующей точки.
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

InString с конца

Сообщение Дед Пахом »

А может подразумевалось искать одну букву "Жэ с точкой"?
С уважением, ДП
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

InString с конца

Сообщение Андрей »

Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1378
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

InString с конца

Сообщение RaFaeL »

Напомню про сервис Дадаты на всякий случай, который такое умеет в лучшем виде )
kreator
✯ Ветеран ✯
Сообщения: 4984
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

InString с конца

Сообщение kreator »

Андрей писал(а):Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца
Вообще это чушь, разбирать строку по непонятным критериям. "Д." вполне может быть деревней, дорогой и т.д. Если, конечно, Вы точно уверены в строке, то да.
Может лучше КЛАДР посмотреть? Или, действительно, сервис Дадаты рассмотреть? На 100% не хранится там всё в одной строке.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

InString с конца

Сообщение Андрей »

kreator писал(а):
Андрей писал(а):Да, да
Ну на самом деле не 'Ж.' а 'Д.' в адресе надо номер дома найти
Нас. пункт ТакойТо ул. ТакаяТо д. 55 к.а кв.11
Пришлось циклик делать, коль InString неполноценная с конца
Вообще это чушь, разбирать строку по непонятным критериям. "Д." вполне может быть деревней, дорогой и т.д. Если, конечно, Вы точно уверены в строке, то да.
Может лучше КЛАДР посмотреть? Или, действительно, сервис Дадаты рассмотреть? На 100% не хранится там всё в одной строке.
Если искать "д." слева направо, то конечно можно на деревню дедушке попасть, но ежели справа налево, то в моем случае на 100% на дом попадаю.
PavelNK
Старожил
Сообщения: 262
Зарегистрирован: 15 Март 2011, 8:02

InString с конца

Сообщение PavelNK »

А не лучше ли использовать функцию StrPos?
Написать нормальный шаблон для поиска и не заниматься поиском с конца и т.д.
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

InString с конца

Сообщение Shur »

Если очень нужно искать с конца, то можно написать функцию типа REVERSE(), переворачивающую строку. Тогда

Код: Выделить всё

PosDom#=InString(REVERSE('Ж.'),REVERSE(UPPER(Clip(l:Adres))),1,1)
даст вам ожидаемое.
kreator
✯ Ветеран ✯
Сообщения: 4984
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

InString с конца

Сообщение kreator »

Shur писал(а):Если очень нужно искать с конца, то можно написать функцию типа REVERSE(), переворачивающую строку. Тогда

Код: Выделить всё
PosDom#=InString(REVERSE('Ж.'),REVERSE(UPPER(Clip(l:Adres))),1,1)

даст вам ожидаемое.
И эта функция каким-то образом должна работать по крайней мере на порядок быстрее Instring. :D
We are hard at work… for you. :)
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

InString с конца

Сообщение Shur »

kreator писал(а): И эта функция каким-то образом должна работать по крайней мере на порядок быстрее Instring.
Читаем с начала, а не с конца:
Shur писал(а): Если очень нужно...
А вообще про эффективность автор темы не спрашивал. На данном этапе, как я понимаю, его больше заботит правильный разбор адреса.
В каком режиме он делает обработку - в пакетном или ещё как -- мы не знаем.
IMHO Функция INSTRING по природе своей не быстра, поэтому переворачивание строк сильно уже не повредит.
kreator
✯ Ветеран ✯
Сообщения: 4984
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 20 раз

InString с конца

Сообщение kreator »

Shur писал(а):IMHO Функция INSTRING по природе своей не быстра, поэтому переворачивание строк сильно уже не повредит.
Спорить не буду, вот здесь последнее обсуждение скорости instring - http://forum.clarionlife.net/phpbb/view ... f=1&t=3751.
We are hard at work… for you. :)
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

InString с конца

Сообщение Shur »

Для пакетного режима лучше использовать самописную функцию, лишённую вышеозначенного изъяна.

Код: Выделить всё

MyInstring PROCEDURE(pat STRING, str STRING, step LONG, pos LONG),LONG
   CODE
     len1# = len(str)
     len2# = len(pat)
     if len1# < len2#
        RETURN(0)
     end      
     from# = choose(step=-1,len1#,pos)
     to# = choose(step=-1,len2#,len1#-len2#+1)
     loop i# = from# to to# by step
        if by# < 0  
           if str[i#-len2#+1:i#] = pat
              RETURN(i#-len2#+1)
           end
        else
           if str[i#:i#+len2#-1] = pat
              RETURN(i#)
           end
        end   
     end
     RETURN(0)
Последний раз редактировалось Shur 02 Февраль 2017, 12:29, всего редактировалось 4 раза.
Ответить