Author Topic: Как поднять слово букву в верхний регистр и наоборот?  (Read 2491 times)

0 Members and 1 Guest are viewing this topic.

inilim

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Английская и русская раскладка. Есть готовое решение?
Поиск не чего не дал.
С уважением.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Для версии кликера 4.13

Code: (clickermann) [Select]
SUB(Cap, $mode, $input_str) // Подпрограмму пишем в начале скрипта до основного кода
   IF($first = 0)
      $first = 1
      STRSEPARATE("А:Б:В:Г:Д:Е:Ё:Ж:З:И:Й:К:Л:М:Н:О:П:Р:С:Т:У:Ф:Х:Ц:Ч:Ш:Щ:Ъ:Ы:Ь:Э:Ю:Я:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z", ":", $arr_cap)
      STRSEPARATE("а:б:в:г:д:е:ё:ж:з:и:й:к:л:м:н:о:п:р:с:т:у:ф:х:ц:ч:ш:щ:ъ:ы:ь:э:ю:я:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z", ":", $arr_cap2)
   END_IF
   $let = $input_str   
   $let3 = ""
   $arrsiz=ARRSIZE($arr_cap)
   FOR($i1=1,$i1<=STRLEN($let))
      $let2 = STRCUT($let,$i1,1)
      $out = 0
      FOR($i2=0,($i2<$arrsiz)&($out=0))
         IF(($let2 = $arr_cap[$i2]) & (($mode = 3)|($mode = 2))) // Большие в маленькие
            $let2 = $arr_cap2[$i2]
            $out = 1
         END_IF
         IF(($let2 = $arr_cap2[$i2]) & (($mode = 3)|($mode = 1))&($out = 0)) // Маленькие в большие
            $let2 = $arr_cap[$i2]
            $out = 1
         END_IF
      END_CYC
      $let3 = STRCONCAT($let3, $let2)
   END_CYC
   $let = $let3
END_SUB

// В скрипте в нужном месте вызываем подпрограмму Cap
// Параметры 1 - ВСЕ БУКВЫ БОЛЬШИЕ
//           2 - все буквы маленькие
//           3 - большие в маленькие - маленькие в большие

Cap(1, "Посчитал есть аналог функции как в php mb_strtoupper. Вот как бы) А на форуме поиск не выдает не чего.")

LOGWRITE ($let) // Итоговая строка выводится в переменную $let


HALT
« Last Edit: June 14, 2018, 09:40:26 PM by Oraven »

inilim

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Это вы написали для меня? или уже было готовое решение?
В любом случае колоссальное спасибо. :)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Это вы написали для меня? или уже было готовое решение?
В любом случае колоссальное спасибо. :)

Для тебя конечно, куда б ты без меня то...  ;D

inilim

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Молодец за отсутствия лени, и помощь незнакомцам.
Если бы до завтра не было ответа, я начал бы писать сам. Был уверен что велосипед уже создан)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Улучшил алгоритм, теперь работает в разы быстрее
Code: (clickermann) [Select]
SUB(Cap, $mode, $input_str) // Подпрограмму пишем в начале скрипта до основного кода
   IF($first = 0)
      $first = 1
      $a_let = "А:Б:В:Г:Д:Е:Ё:Ж:З:И:Й:К:Л:М:Н:О:П:Р:С:Т:У:Ф:Х:Ц:Ч:Ш:Щ:Ъ:Ы:Ь:Э:Ю:Я:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z"
      $a_let_f = STRFILTER($a_let, ":", 0)
      STRSEPARATE($a_let,":",$arr_cap)
      STRSEPARATE("а:б:в:г:д:е:ё:ж:з:и:й:к:л:м:н:о:п:р:с:т:у:ф:х:ц:ч:ш:щ:ъ:ы:ь:э:ю:я:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z", ":", $arr_cap2)
      $arrsiz=ARRSIZE($arr_cap)
   END_IF
   $let = $input_str
   $let3 = ""
   FOR($i1=1,$i1<=STRLEN($let))
      $let2 = STRCUT($let,$i1,1)
      $str_pos = STRPOS($a_let_f,$let2)
      IF($str_pos > 0)
         $out = 0
         IF(($let2 = $arr_cap[$str_pos-1]) & (($mode = 3)|($mode = 2))) // Большие в маленькие
            $let2 = $arr_cap2[$str_pos-1]
            $out = 1
         END_IF
         IF(($let2 = $arr_cap2[$str_pos-1]) & (($mode = 3)|($mode = 1))&($out = 0)) // Маленькие в большие
            $let2 = $arr_cap[$str_pos-1]
            $out = 1
         END_IF
      END_IF
      $let3 = STRCONCAT($let3, $let2)
   END_CYC
   $let = $let3
END_SUB

// В скрипте в нужном месте вызываем подпрограмму Cap(режим,строка)
// Параметры 1 - ВСЕ БУКВЫ БОЛЬШИЕ
//           2 - все буквы маленькие
//           3 - БОЛЬШИЕ в маленькие - маленькие в БОЛЬШИЕ
Cap(1, "Тут сТрОкА Текста ИЛИ пЕРЕМЕННАЯ")
LOGWRITE ($let) // Итоговая строка выводится в переменную $let

HALT

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Не понимаю, почему у меня английскую букву E игорит?

Code: (clickermann) [Select]

SUB(STRTOUPPER, $input_string)
   IF($len_letters != 59)
      STRSEPARATE("А:Б:В:Г:Д:Е:Ё:Ж:З:И:Й:К:Л:М:Н:О:П:Р:С:Т:У:Ф:Х:Ц:Ч:Ш:Щ:Ъ:Ы:Ь:Э:Ю:Я:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z", ":", $arraylist_upperLetters)
      $len_letters = ARRSIZE($arraylist_upperLetters)
   END_IF
   FOR($i = 1, $i < STRLEN($input_string) + 1)
      $cut = STRCUT($input_string, $i, 1)
      $pos = STRPOS("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ", $cut)
      IF($arraylist_upperLetters[$pos-1] != $cut)
         $input_string = STRCONCAT(STRCUT($input_string, 1, $i-1), $arraylist_upperLetters[$pos-1], STRCUT($input_string, $i+1, STRLEN($input_string)))
      END_IF
   END_CYC
   $return_string = $input_string
END_SUB

STRTOUPPER("test")

PRINT($return_string) // Результат 15:04:45 TeST

HALT

«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Русские буквы подсвечены красным
https://yadi.sk/d/BleDaN8KVlWZYQ
З.Ы. Проблема в 64 битной версии кликера. Но суть проблема не ясна, он почему то не видит разницы между большой и маленькой буквой E
« Last Edit: October 03, 2018, 03:57:49 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Наверно на 64 битах пролазит старая проблема смены типа. Со строки на число.
Пытается преобразовать формат экспоненциальной записи, вроде
2E5  = 2 * 10^5  =  200000

Вот цифр нет, а не E агрится.