Author Topic: Неверно определяется символ в строке текста  (Read 5352 times)

0 Members and 1 Guest are viewing this topic.

Анатолий

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Общая задача: найти позицию десятичной точки в строке содержащей число.
Команда скрипта:

IF(STRCUT($txt, $pos, 1) = ".")
[...]

При наличии точки или любой цифры от 1 до 9 - все ОК.
При попадании на 0 (ноль) распознается так-же как и точка, т.е. переходит на выполнение [...].

ps: видел проявление ошибки только на цифрах, про другие символы ничего сказать не могу.
!A EB!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
http://crapware.aidf.org/forum/index.php?topic=356.msg8215#msg8215

Вкратце. Из-за динамической типизации программа часто пытается преобразовать строку в число, если это возможно.
Т.е. отсеивается всё, кроме цифр и точки, сравнивается с исходником. Если равно то в строковой переменной число и его можно перевести в число. На этапе этой проверки должно ещё проверяться есть ли хоть одна цифра иначе одна точка "." переводится в число .0  = 0.0  = 0
В итоге ноль равно нолю.

В примере как-то странно выполняется задача по поиску десятичной точки в строке. Там просто нет поиска вообще.
Вот позиция точки в строке
Code: (clickermann) [Select]
LOGWRITE(STRPOS ($txt, "."))
Если позиция = 0  точки нет
« Last Edit: January 29, 2016, 03:21:15 PM by Vint »


Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Code: (clickermann) [Select]
$c1= "строка содержащая число 607548.870654"
$c2= "."
$c3= STRPOS($c1,$c2)
LOGWRITE ($c3)
HALT
STRCUT  - строковая функция; возвращает кусок строки, а задача определить позицию?
STRPOS  - числовая функция; возвращает позицию подстроки в строке. Хотя очевидно, что называть эту функцию числовой было опрометчиво.
« Last Edit: January 29, 2016, 03:32:36 PM by Золотой »

Анатолий

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Приветствую!
Спасибо всем, кто откликнулся и ура коллективному разуму! :)

2 Vint!
Если я правильно понял, то все происходит следующим образом. Программа преобразует паттерн (в д.с. ".") в значение 0.
Анализирует найденную позицию. Если там ".", то ее также преобразует в 0. Имеем два 0: условие выполняется. Если в позиции 0 - опять два 0, условие выполняется.
Вопрос: есть ли какие-нибудь наработки, чтобы красиво обойти эту ловушку?

2 ALL!
Конечно, я знаком с командой STRPOS() и использую ее при необходимости. Но в моей ситуации она не подходит, т.к. в строке может быть не одна точка, а произвольное количество, и, скорее всего, все остальные будут мусором (анализируемый текст получен через сканирование и OCR, а там все что угодно может быть  :-\ ) Команда же STRPOS() находит первое вхождение паттерна в тексте, а у меня искомое может быть и в начале строки, и в конце, и в середке. Поэтому приходится изгаляться. Решение я нашел, но оно весьма частное и некрасивое. А нужно все сделать скорее-скорее-скорее...  >:(
Ну да ладно, работает - и хорошо!

В конце своего затянувшегося повествования (блин, чукча-писатель  ;D ) хочу от всей души поблагодарить авторов программы за о-о-очень классный продукт. В свое время мне понадобился кликер, я установил Кликерманн, быстренько состряпал скрипт - и вуаля! - усе заработало!!! А тут вот срочно понадобилось эти чертовы цифры искать и я подумал: а почему бы и не Кликерманн? Все что надо - есть, все ясно и понятно (правда, оказалось - не все  :-[ ) и опять усе заработало! Честь и хвала. Спасибо!!!

С уважением,
!A EB!

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
IF(STRPOS($txt, ".") > 0)
   LOGWRITE ("Точка есть")
END_IF

Анатолий

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Code: (clickermann) [Select]
IF(STRPOS($txt, ".") > 0)
   LOGWRITE ("Точка есть")
END_IF

А если их там аж 25 штук, етих точек? А нужна токма ОДНА?
!A EB!

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Можно сначала отфильтровать все кроме цифр и точек
Code: (clickermann) [Select]
$txt = STRFILTER($txt, "1234567890.", 1)
IF(STRPOS($txt, ".") > 0)
   LOGWRITE ("Точка есть")
END_IF

А потом уже разбираться с точками

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Общая задача: найти позицию десятичной точки в строке содержащей число.
Тут явно неверно сформулирована общая задача. оказывается точек не одна а может быть 25. Вероятно и цифр не одна, с точками и без и по каким критериям желаете определять правильные цифры или продолжаете настаивать на нахождении позиции нужной точки? Непонятно, какой от этой точки прок.
« Last Edit: January 29, 2016, 07:37:26 PM by Золотой »

Анатолий

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Можно сначала отфильтровать все кроме цифр и точек...
.....
А потом уже разбираться с точками

Ну да. Где-то подобным образом я и решил задачу. Пока работает. Спасибо.
!A EB!

Анатолий

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Общая задача: найти позицию десятичной точки в строке содержащей число.
Тут явно неверно сформулирована общая задача...
...

Конечно же я обозначил лишь часть задачи, да и смысла не видел в подробном разжевывании. Дело в том, что меня, собственно, интересовало другое: почему при нахождении точки и цифры 0 выдавался одинаковый результат (см. тему топика). После объяснения Vint реакция программы стала ясна. А точку-то я уже давно решил как найти.
!A EB!