Отправляет email-рассылки с помощью сервиса Sendsay

[TC] Скрипты. StringChopRight неправильно режет.

Здравствуйте, господа подписчики.

Объясните, в чём тут дело. Вот часть скрипта:

let sVar="9999.8888"

Let iVar = (StringToInt (stringChopRight (sVar, StringContains (sVar,
"."))))

SayInteger (iVar)

Когда sVar = 9999.8888 (т.е. 4 символа перед и 4 после точки), то
произносится именно так, как задумано, т.е. "9999. Но если я начинаю убирать
символы справа, то получаю неожиданный результат:

9999.888 говорит уже (999"

9999.88 говорит "99"

9999.8 говорит "9"

В чём тут дело? Мне важно, чтобы кол-во символов слева проговаривалось
всегда в полном объёме независимо от того, сколько знаков стоит после точки.

Ответить   Игорь Лялин Thu, 16 Jun 2011 23:16:01 +0400 (#1666513)

 

Ответы:

Vande omentaina, Игорь Лялин!

ИЛ> В чём тут дело? Мне важно,
чтобы кол-во символов слева проговаривалось

Вы спешите с изменением типа.
Ваша строка:
Let iVar = (StringToInt (stringChopRight (sVar, StringContains (sVar,
"."))))
по сути не имеет смысла. Вы оборачиваете всё в StringToInt(),
соответственно, пытаетесь чопать (StringChopRight) уже целое число.
Но вы забываете, что StringToInt("9999.8888")===9999.

Решение:
Let iVar = stringChopRight (sVar, StringContains (sVar,
"."))
SayInteger(StringToInt(iVar))

Ответить   Thu, 16 Jun 2011 22:38:08 +0300 (#1666576)

 

<20110616233838.1666576.0@0.industry.comp.tiflocomp.subscribe>

Sent: Thursday, June 16, 2011 11:38 PM

Так вобще не компилируется. iVar в данном случае должна была бы быть типа
String, а она здесь int.

А разве последовательность выполнения выражения let iVar = (StringToInt
(stringChopRight (sVar, StringContains (sVar, ".")))) не следующая:
1. Взять строковую переменную sVar и найти в ней точку (StringContains).
2. Отрезать всё, что справа от точки (StringChopRight).
3. Преобразовать то, что осталось в int (StringToInt).
4. И присвоить всё это iVar (let iVar=).

Т.е. по моей мысли в StringToInt передаётся готовый вариант, который ещё
является стрингом.

Ответить   Игорь Лялин Fri, 17 Jun 2011 01:14:29 +0400 &lt;20110616233838.1666576.0@0.industry.comp.tiflocomp.subscribe&gt; (#1666681)

 

<20110616233838.1666576.0@0.industry.comp.tiflocomp.subscribe>
<20110617011504.1666681.16333953@16333953.industry.comp.tiflocomp.subscribe>

Vande omentaina, Игорь Лялин!

ИЛ> Т.е. по моей мысли в StringToInt
передаётся готовый вариант, который ещё

Да, пожалуй, вы правы. Очевидно, направил вас по ложному пути, сорри.
Но сделать промежуточную переменную типа string всё равно советую,
потом с помощью SayString протестить, что выйдет.

Ответить   Fri, 17 Jun 2011 16:58:23 +0300 (#1667940)

 

Доброго времени суток, Игорь Лялин.

Из сообщения от 16.06.2011 22:19:

Вы отрезаете от строки справа то, что отмеряете слева :).

Let iVar = (StringToInt (stringChopRight (sVar, stringLength (sVar) -
StringContains (sVar, "."))))

С уважением, Руслан Усачев

Ответить   Fri, 17 Jun 2011 07:55:11 +0300 (#1666945)

 

Привет Игорь!
StringContains (sVar, ".")

номер символа в строке в данном конкретном случае это 5

первые четыре девятки и сама точка.

отрезание же происходит справа

тоесть при 9999.888

отрезаются 3 восьмёрки сама точка и одна девятка

работающее решение в том ключе что предложено тобой:

Let iVar = StringToInt (stringChopRight (sVar, 1+StringLength (sVar)-StringContains
(sVar, ".")))

теперь на всякий случай как работает эта строка

первым срабатывает то что внутри

StringLength (sVar)-StringContains (sVar, ".")

тоесть длина строки минус номер символа точки

8-5 = 3

иными словами расстояние от конца строки до точки не включая её саму.

но нам она не нужна поэтому добавляем 1 символ

1+StringLength (sVar)-StringContains (sVar, ".")

тоест 1+8-5=4

затем происходит собственно отрезание с права включая точку и наконец конвертация
в число из строки

брать в скобки всю конструкцию излишне.

кстати попробуй лучше вот такой вариант:

Let iVar =StringToInt (StringSegment (sVar, ".", 1))

Виктор Горелов

Ответить   Fri, 17 Jun 2011 08:55:08 +0400 (#1666948)

 

<20110617085742.1666948.14906613@14906613.industry.comp.tiflocomp.subscribe>

Доброго времени суток, Виктор Горелов.

Из сообщения от 17.06.2011 7:58:

Справедливое замечание по поводу "+1".

А еще лучше:
Let iVar =StringToInt(sVar)

С уважением, Руслан Усачев

Ответить   Fri, 17 Jun 2011 08:24:34 +0300 &lt;20110617085742.1666948.14906613@14906613.industry.comp.tiflocomp.subscribe&gt; (#1666979)

 

<20110617085742.1666948.0@0.industry.comp.tiflocomp.subscribe>

Sent: Friday, June 17, 2011 8:55 AM

Действительно, это куда проще и понятнее. Виктора и Руслана благодарю.
Проблему решил.

Ответить   Игорь Лялин Fri, 17 Jun 2011 09:51:36 +0400 &lt;20110617085742.1666948.0@0.industry.comp.tiflocomp.subscribe&gt; (#1666996)

 

<20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe>

Здравствуйте, Виктор.

Вы писали 17 июня 2011 г., 8:55:08:

да инераз ;)

Ответить   рокер Fri, 17 Jun 2011 13:07:04 +0400 &lt;20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe&gt; (#1667284)

 

<20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe>

<20110617131818.1667284.0@0.industry.comp.tiflocomp.subscribe>

Sent: Friday, June 17, 2011 1:07 PM

Премод до выяснения причин.

а--
Комодератор Игорь Лялин, mode***@g*****.com

Ответить   Fri, 17 Jun 2011 19:10:51 +0400 &lt;20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe&gt; &lt;20110617131818.1667284.0@0.industry.comp.tiflocomp.subscribe&gt; (#1668057)

 

<20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe>

Здравствуйте, Виктор.

Вы писали 17 июня 2011 г., 8:55:08:

и сильно причом ;)

Ответить   рокер Fri, 17 Jun 2011 13:07:28 +0400 &lt;20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe&gt; (#1667285)

 

<20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe>

<20110617131830.1667285.0@0.industry.comp.tiflocomp.subscribe>

Sent: Friday, June 17, 2011 1:07 PM

...

[+] Предупреждение.
Причина: избыточное цитирование.

[+] Предупреждение.
Причина: Бессмысленное письмо.

Ответить   Fri, 17 Jun 2011 19:07:42 +0400 &lt;20110617085742.1666948.17118619@17118619.industry.comp.tiflocomp.subscribe&gt; &lt;20110617131830.1667285.0@0.industry.comp.tiflocomp.subscribe&gt; (#1668044)