Author Topic: Запятая мешает вычислениям?  (Read 2214 times)

0 Members and 1 Guest are viewing this topic.

Space

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Запятая мешает вычислениям?
« on: April 17, 2019, 11:18:12 PM »
Копируются два числа с запятыми  123,45 и 678,91
После назначения двух переменных командами DEFINE из буфера, два числа остаются также с запятыми. Нужно выполнить арифметическое действие (123,45+678,91)/2
Если вместо запятой изначально стоит точка, то вычисление произойдет. А так как копируется только с запятой, то и вычисление не происходит.
==========================================
с запятой копированные из браузера

лог файлы
19:10:54 123,45 - h1 переменная
19:10:54 678,91 - h2 переменная
19:10:54  --- ("123,45"+"678,91")/2 -- результат---
=============================================
если назначаем переменные из заранее подготовленных чисел, но с ТОЧКОЙ

лог файлы
19:10:54 123.45 - h1 переменная
19:10:54 678.91 - h2 переменная
19:10:54 401.18 -- результат---
===========================================
если назначаем переменные из заранее подготовленных чисел, но с ЗАПЯТОЙ
также вычисляет, причем в переменной запятая становится точкой

скрипт $h1 = 123,45
скрипт $h2 = 678,91  //  заранее подготовленные с !запятой

лог 19:17:14 123.45 - h1 переменная до вычисления    !с точкой
лог 19:17:14 678.91 - h2 переменная до вычисления    !с точкой
скрипт      $E=($h1+$h2)/2+0.1 // вычисления
лог 19:17:14 401.28 -- результат---
лог 19:17:14 123.45 --после вычисления h1 переменная
лог 19:17:14 678.91 --после вычисления h2 переменная

 А с копированием из браузера - не становится точкой
============================================
Не могу разобраться, как решить эту головоломку? Изначально пробовал прибавлением времени, т.к. весь скрипт пролетает за 1 сек. Но оказалось не там копал и после расстановки по цепочке этажерки из команд -  LOGWRIT понял, что дело кроется в запятой.
Или как заменить запятую на точку?
« Last Edit: April 17, 2019, 11:31:21 PM by Space »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Запятая мешает вычислениям?
« Reply #1 on: April 18, 2019, 01:11:59 AM »
....
Или как заменить запятую на точку?

Самым верным вариант - функция STRREPLACE, которая возвращает результирующую строку, в которой искомая подстрока заменяется на другую строку.

Code: (clickermann) [Select]
$h1 = "123,45"
$h2 = "678,91"


$h1 = STRREPLACE ($h1, ",", ".")   // заменяем запятую на точку
$h2 = STRREPLACE ($h2, ",", ".")


print($h1 + $h2)     //работает
halt


Но у меня чегото не клеилось по началу, я  подумал что STRREPLACE не функция  :-[, и результат не получался.... По этому нагородил еще кучку костылей  :D :

Code: (clickermann) [Select]
$h1 = "123,45"
$h2 = "678,91"


$pos = STRPOS ($h1, ",")
IF($pos > 1)
   $h1 = STRFILTER ($h1, ",", 0)
   $h1 = STRCONCAT(STRCUT2($h1,1,$pos-1),".",STRCUT2($h1,$pos, STRLEN ($h1)))
END_IF

IF($pos > 1)
   $pos = STRPOS ($h2, ",")
   $h2 = STRFILTER ($h2, ",", 0)
   $h2 = STRCONCAT(STRCUT2($h2,1,$pos-1),".",STRCUT2($h2,$pos, STRLEN ($h1)))
END_IF

print($h1 + $h2)     //работает


////////////////////////////////////////////

$h1 = "123,45"
$h2 = "678,91"



STRSEPARATE ($h1, ",", $arr1)
IF(arrsize($arr1) = 2)
   $h1 = $arr1[0] + $arr1[1]/POW(10,STRLEN($arr1[1]))
END_IF

STRSEPARATE ($h2, ",", $arr2)
IF(arrsize($arr2) = 2)
   $h2 = $arr2[0] + $arr2[1]/POW(10,STRLEN($arr2[1]))
END_IF
undefine($arr1)
undefine($arr2)

print($h1 + $h2)     //работает


////////////////////////////////////////////

$h1 = "123,45"
$h2 = "678,91"



STRSEPARATE ($h1, ",", $arr1)
IF(arrsize($arr1) = 2)
   $h1 = STRCONCAT($arr1[0], ".", $arr1[1])
END_IF


STRSEPARATE ($h2, ",", $arr2)
IF(arrsize($arr2) = 2)
   $h2 =STRCONCAT($arr2[0], ".", $arr2[1])
END_IF
undefine($arr1)
undefine($arr2)


print($h1 + $h2)     //работает

halt

Space

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Запятая мешает вычислениям?
« Reply #2 on: April 18, 2019, 08:06:52 AM »
Спасибо! Варианты попробую.

Space

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Запятая мешает вычислениям?
« Reply #3 on: April 18, 2019, 09:44:33 AM »
Все отлично вычисляет! Спасибо!
Скрипт - проверка работы вычисления

Code: (clickermann) [Select]
TOCLIP("")    // Очистить буфер

///////  копирование  /////

      LCLICK(1253,82)  // жм.кн. перекл.
      WAITMS(100)

      LCLICK(1173,224)// жм.кн. -G
      WAITMS(150)

      LCLICK(1217,172)     //  копируем
      WAITMS(50)           //
      KEYDOWN(#CTRL) //
      WAITMS(50)           //
      KEYPRESS(#a)       //
      WAITMS(50)           //
      KEYPRESS(#c)       //
      WAITMS(50)           //
      KEYUP (#CTRL)      //
      WAITMS(50)
      DEFINE($h1, FROMCLIP()) // DEFINE Объявляет переменную и присваивает ей значение из FROMCLIP который возвращает строку, находящуюся в буфере обмена
      WAITMS(50)

      LCLICK(1173,166) //жм.кн -R
      WAITMS(50)

      LCLICK(1217,172)    // копируем
      WAITMS(50)           //
      KEYDOWN(#CTRL) //
      WAITMS(50)           //
      KEYPRESS(#a)       //
      WAITMS(50)           //
      KEYPRESS(#c)       //
      WAITMS(50)           //
      KEYUP (#CTRL)      //
      WAITMS(50)           //   
      DEFINE($h2, FROMCLIP()) //
      WAITMS(50)
     
      LOGWRITE($h1, " - $h1 до преобразования зпт в тчк")
      LOGWRITE($h2, " - $h2 до преобразования зпт в тчк") 

////////  преобразование зпт в тчк  /////////    

$pos = STRPOS ($h1, ",")// Возвращает позицию начала искомой подстроки во входной строке.
IF($pos > 1)
   $h1 = STRFILTER ($h1, ",", 0)// Возвращает строку, из которой удаляются определенные символы.
   $h1 = STRCONCAT(STRCUT2($h1,1,$pos-1),".",STRCUT2($h1,$pos, STRLEN ($h1)))// STRCONCAT Возвращает объединенную строку, состоящую из других строк.STRCUT Возвращает подстроку из входной строки. STRLEN Возвращает длину входной строки в символах

END_IF
 
IF($pos > 1)
   $pos = STRPOS ($h2, ",")
   $h2 = STRFILTER ($h2, ",", 0)
   $h2 = STRCONCAT(STRCUT2($h2,1,$pos-1),".",STRCUT2($h2,$pos, STRLEN ($h1)))
END_IF

      LOGWRITE($h1, " - $h1 до вычисления- ")
      LOGWRITE($h2, " - $h2 до вычисления- ")
      WAITMS(100)

      $q=($h1+$h2)/2+0.1 // вычисления
     

      WAITMS(50)
      LOGWRITE(" --- ", $q, " --РЕЗУЛЬТАТ--- ")
 
      HALT

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Запятая мешает вычислениям?
« Reply #4 on: April 18, 2019, 11:44:46 AM »
Чем тебе STRREPLACE не понравилось?

Code: (clickermann) [Select]
TOCLIP("")    // Очистить буфер

///////  копирование  /////

LCLICK(1253,82)  // жм.кн. перекл.
WAITMS(100)

LCLICK(1173,224)// жм.кн. -G
WAITMS(150)

LCLICK(1217,172)     //  копируем
WAITMS(50)           //
KEYDOWN(#CTRL) //
WAITMS(50)           //
KEYPRESS(#a)       //
WAITMS(50)           //
KEYPRESS(#c)       //
WAITMS(50)           //
KEYUP (#CTRL)      //
WAITMS(50)
$h1 = STRREPLACE (FROMCLIP(), ",", ".")
WAITMS(50)

LCLICK(1173,166) //жм.кн -R
WAITMS(50)

LCLICK(1217,172)    // копируем
WAITMS(50)           //
KEYDOWN(#CTRL) //
WAITMS(50)           //
KEYPRESS(#a)       //
WAITMS(50)           //
KEYPRESS(#c)       //
WAITMS(50)           //
KEYUP (#CTRL)      //
WAITMS(50)           //
$h2 = STRREPLACE (FROMCLIP(), ",", ".")

$q=($h1+$h2)/2+0.1 // вычисления
LOGWRITE(" --- ", $q, " --РЕЗУЛЬТАТ--- ")

HALT

Space

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Запятая мешает вычислениям?
« Reply #5 on: April 18, 2019, 05:12:29 PM »
Варианты от dramster все хороши. Проверив один из вариантов, сразу решил поблагодарить человека.
Чем больше на форуме находишься, тем больше поражаешься находчивостью и кратким решением задач  - завсегдатаев форума.  Спасибо!
Так-же благодарю Oraven, за оригинальные подсказки. Этот вариант с применением STRREPLACE о котором упоминал выше dramster работает быстрее!