Author Topic: Как правильнее и короче извлечь цифры из предложения?  (Read 1746 times)

0 Members and 1 Guest are viewing this topic.

123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Надо время, упомянутое в предложении, перевести в секунды. В зависимости от указанного в нём времени, предложение может быть в нескольких вариантах, примеры:

"... через 11 мин. 11 с."
"... через 11 мин. 1 с."
"... через 1 мин. 11 с."
"... через 11 с."
"... через 1 с."

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
$str = "... через 1 мин. 11 с."
$count = STRPOS($str, "через")
IF($count > 0)
   $str2 = STRFILTER(STRCUT2($str, $count+6, STRLEN($str)), " ", 0)
   $count2 = STRPOS($str2, "мин.")
   IF($count2 > 0)
      $m = STRCUT2($str2, 1, $count2-1)
      $str2 = STRCUT2($str2, $count2+4, STRLEN($str2))
      $count2 = STRPOS($str2, "с.")
      $s = 0
      IF($count2 > 0)
         $s = STRCUT2($str2, 1, $count2-1)
      END_IF
      $str = STRCONCAT(STRCUT2($str, 1, $count+5), ($m*60)+$s, " с.")
   END_IF
END_IF

LOGWRITE ($str)

123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Вроде всё как можно проще и предусмотрено для разного количества цифр.
Но извлечение секунд должно быть раньше, т.к. они всегда есть, а минут нет, когда времени осталось меньше одной минуты:
"... через 11 с."
"... через 1 с."
Иначе при любых значениях меньше одной минуты получается ноль секунд.

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Code: (clickermann) [Select]
//           D М И Н С .
//           0 1 2 3 4 5
//       
// STATE 0   0 0 0 0 0 1   
//       1   0 0 0 2 S 0
//       2   0 0 3 0 0 0
//       3   0 M 0 0 0 0
//         
//                                ОК              ОК                ОК                ОК
$input_str = "... через нананана 1 с. 4543 ммин 1 мин. 499999 си. 05 мин. 1000 дин. 1000 с."
$lenght = STRLEN($input_str)
 
STRSEPARATE("0:0:0:0:0:1:0:0:0:2:99:0:0:0:3:0:0:0:0:40:0:0:0:0", ":", $array_state)
 
WHILE($lenght >= $i)
   skip_space:
   $char = STRCUT($input_str, $lenght - $i, 1)
   INC($i) 
   IF($char = " ")
      GOTO(skip_space)
   END_IF                                     
   IF($state < 4)
      SWITCH($char) 
      CASE("м")
         $char = 1
      CASE("и")
         $char = 2
      CASE("н")
         $char = 3
      CASE("с")
         $char = 4
      CASE(".")
         $char = 5
      DEFAULT
         $char = 0     
      END_SWITCH
      $state = $array_state[$state*6+$char]
   ELSE
      $char = CODE($char)
      IF( ($char >= #0) and ($char <= #9) )
         $time = (CHAR($char)*POW(10, $k)*(100-$state)) + $time
         INC($k)
      ELSE 
         $state = 0
         $k = 0
         $i = $i - 1
      END_IF   
   END_IF  
END_CYC
 
PRINT($time)
 
HALT

Code: ("") [Select]
02:17:51 1361
« Last Edit: February 11, 2020, 01:04:52 AM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»