View Issue Details

IDProjectCategoryView StatusLast Update
0001480WishesMacropublic2013-02-03 00:34
ReporterJohnDoe Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Fixed in Version2.0 
Summary0001480: Расширить substr() для того, чтоб она могла возвращать подстроку начиная с конца строки
Description> S=substr(V,N1,N2)
Хочется внести следующее дополнение: «Если параметр N1 меньше 0, то вернётся подстрока начиная с N1 символа от конца строки».

Т.е. результат тот же, что при использовании «substr(V,len(V)-N1-1,N2)», только изящнее.

http://forum.farmanager.com/viewtopic.php?p=67960#p67960
Additional InformationОпечатка: "длинной"
S=substr(V,N1,N2) Возвращает подстроку из выражения V начиная с позиции N1 длинной N2.

Правильно: "длиной"
S=substr(V,N1,N2) Возвращает подстроку из выражения V начиная с позиции N1 длиной N2.
TagsNo tags attached.
Build1805

Activities

JohnDoe

2010-08-30 09:14

updater  

functions.html.diff (832 bytes)   
Index: functions.html
===================================================================
--- functions.html	(revision 4997)
+++ functions.html	(working copy)
@@ -121,7 +121,8 @@
   <tr class="cont">
     <td class="cont" width="40%">S=<dfn><a name="substr">substr</a></dfn>(V,N1[,N2])</td>
     <td class="cont" width="60%">��������� ��������� �� ������� <em>V</em>
-      ����� � ������ <em>N1</em> ������� <em>N2</em>.<br>
+      ����� � ������ <em>N1</em> ������ <em>N2</em>.<br>
+      ���� �������� <em>N1</em> ���� 0, �� ������ ��������� ����� � <em>N1</em> ������� �� ���� ������.<br>
       ���� �������� <em>N2</em> �� ������ ��� ����� -1, �� ������ ��������� �� ������ <em>N1</em> �� ���� ������.<br>
       ���� �������� <em>N2</em> ����� 0, �� ������ ����� ������.<br>
       </td>
functions.html.diff (832 bytes)   

Raistlin

2011-01-25 21:01

reporter   bugnote:0006243

Поддерживаю и предлагаю дополнительно: если N2<0, то возвращаем подстроку от N1 до символа N2 от конца строки. То есть как в cmd.exe:
C:\>echo %windir%
C:\WINDOWS

C:\>echo %windir:~3,-1%
WINDOW

C:\>echo %windir:~-3,-1%
OW

JohnDoe

2011-01-26 09:36

updater   bugnote:0006244

Raistlin
Мне кажется это пожелание заслуживает отдельного обсуждения

vskirdin

2011-01-26 10:54

administrator   bugnote:0006245

в собачьем языке Lotus`а есть аналогичные функции (несколько)

Raistlin

2011-01-26 11:33

reporter   bugnote:0006246

> Мне кажется это пожелание заслуживает отдельного обсуждения
А смысл их множить? И в том, и в другом случае идет речь об использовании потенциальных возможностей синтаксиса, которые сейчас просто простаивают.

JohnDoe

2011-01-26 11:57

updater   bugnote:0006247

Смысл в том, что предлагаемые изменения могут быть реализованы независимо друг от друга.
Я пока не уверен, что ваше предложение что-то упростит.

Вгляните на теперешнее короткое и понятное определение функции.
Там чётко и недвусмысленно сказано, что N2 это длина подстроки.

Если же посмотреть хелп cmd (set/?), то там нормального определения вообще нет, есть только примеры использования.
В общем, не очень это прямо, когда в одном случае N2 это "длина", а в другом "непонятно что".

Выкрутасы cmd я ещё могу понять, ведь там весьма ограниченные возможности работы со строками, и по-другому это не сделаешь.

Raistlin

2011-01-26 12:21

reporter   bugnote:0006248

> Я пока не уверен, что ваше предложение что-то упростит.
Я нашел этот инцидент, когда хотел создать новый по материалам http://forum.farmanager.com/viewtopic.php?f=15&t=6076 Там неоднократно звучала мысль, что слеш в конце - это хорошо, но вот отрезать при необходимости его замучаешься. Если реализовать мое пожелание, то все сильно упростится. Думаю, это не единственный пример, когда такое расширение функционала пригодилось бы.

> Вгляните на теперешнее короткое и понятное определение функции. Там чётко и недвусмысленно сказано, что N2 это длина подстроки.
Предлагаемое расширение функционала можно не менее четко и недвусмысленно описать:
если N2>=0, то длина подстроки
если N2<0, то номер конечного символа подстроки, отсчитываемый с конца исходной строки

>там нормального определения вообще нет, есть только примеры использования
И это очень правильно! Хороший, четкий и недвусмысленный пример (там, правда, не очень такой) всегда лучше, чем пространное описание.

>Выкрутасы cmd я ещё могу понять, ведь там весьма ограниченные возможности работы со строками
Так зачем уподобляться ему и заставлять пользователя выкрутасничать с len() там, где можно обойтись одним substr()?

JohnDoe

2011-01-26 12:51

updater   bugnote:0006249

Это странно и не интуитивно, что изменение знака N2 меняет его сущность: положительное N2 это "длина", а отрицательное... (Даже не знаю как сформулировать, но одним словом точно не обойтись.)

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

max rusov

2011-01-27 07:52

reporter   bugnote:0006252

Довольно удобно сделано в PHP
http://php.net/manual/en/function.substr.php

Raistlin

2011-01-27 08:48

reporter   bugnote:0006253

>Довольно удобно сделано в PHP
В точности так, как предлагается здесь.

Поправка к моему описанию:
если N2>=0, то возвращаемая подстрока будет состоять максимум из N2 символов исходной строки начиная с N1
если N2<0, то в возвращаемой подстроке будет отсутствовать N2 символов от конца исходной строки, при том, что она будет начинаться с символа N1.

Или: N2 - длина того, что берем (если >=0) или отбрасываем (если <0).

max rusov

2011-01-27 09:20

reporter   bugnote:0006254

> В точности так, как предлагается здесь.
Ну, я и привел ссылку, чтобы показать что это все не отсебятина, а вполне себе стандартно.

JohnDoe

2011-01-27 09:44

updater   bugnote:0006255

Если не отсебятина, то пускай.

Только вот с одной стороны упрощаем, а с другой...
Я прикинул, что описание в Энциклопедии увеличивается в 7 раз.

max rusov

2011-01-27 10:44

reporter   bugnote:0006256

Так, вроде, это же Ваша идея (расширить substr)

vskirdin

2011-01-27 11:12

administrator   bugnote:0006257

хмм... т.е. реализовать предлагается мне? или кто-то сподобится на патч? ;-)

JohnDoe

2011-01-27 11:21

updater   bugnote:0006258

Last edited: 2011-01-27 11:27

Идея (изначально не моя, а с форума) касалась уточнения только одного параметра, и в Энциклопедию это добавляло всего 1 строчку.
Но я уже как бы не сильно против того как в PHP.

Edit:
Патч - не :(
Однако, програмист нужен (с)

vskirdin

2011-01-30 06:41

administrator   bugnote:0006272

Ок, в разделе "Подробности" все верно и полно написано? Или что-то нужно исправить в описании...
(а то я ж ленивый и не буду перечитывать все обсуждение :-))

Raistlin

2011-01-30 11:04

reporter   bugnote:0006281

В Подробностях только пожелание от John Doe, мое как раз в обсуждении. В общем, сделай, пож., так, как в PHP: http://php.net/manual/en/function.substr.php

vskirdin

2011-02-01 11:30

administrator   bugnote:0006304

Ну, помогайте :-)

1) Здесь все правильно написано?

* если start >= 0, то вернётся подстрока, начиная со start-символа от начала строки.
* если start < 0, то вернётся подстрока, начиная со start-символа от конца строки.
* если length > 0, то возвращаемая подстрока будет состоять максимум из length символов исходной строки начиная с start
* если length < 0, то в возвращаемой подстроке будет отсутствовать length символов от конца исходной строки, при том, что она будет начинаться с символа start.


2) так же просьба дополнить утверждения про пустую строку

пустая строка возвращается:
* если length = 0
* если...

3) А в каком случае возвращается _ВСЯ_ строка?

Raistlin

2011-02-01 11:47

reporter   bugnote:0006305

1. Да, учитывая, что при start < 0 start-символ берется от конца строки.

2. Пустая только при length = 0.

3. Вся строка возвращается, если start=0 и length опущен. В более общем случае: если length опущен, возвращаем все, начиная со start.

JohnDoe

2011-02-01 11:52

updater   bugnote:0006306

Last edited: 2011-02-01 11:53

>2. Пустая только при length = 0.
и в случаях типа start=len

Описание для Энциклопедии предлагаю полностью взять из PHP.
Вместе со всеми примерами.

vskirdin

2011-02-01 12:16

administrator   bugnote:0006310

ну для (2) я бы еще добавил следующее... (вот как только описать?)
* если в результате внутренних вычислений start оказывается за пределами строки (влево или вправо, пофигу).

> Описание для Энциклопедии предлагаю полностью взять из PHP.
не уверен, что оно полное. я потому и задал здесь вопросы

Raistlin

2011-02-01 12:32

reporter   bugnote:0006311

> если в результате внутренних вычислений start оказывается за пределами строки (влево или вправо, пофигу).
Если влево, то не по фигу, должны вернуть непустую при достаточно большом length:
C:\>echo %windir:~-20,40%
C:\WINDOWS

vskirdin

2011-02-01 12:52

administrator   bugnote:0006312

правильно я понимаю, что...

пустая строка возвращается:
* если length = 0
* если start+length > длины_строки

Хотя..., если равняться на PHP, то
$rest = substr("abcdef", 4, -4); // возвращает ""

черт, что-то я совсем запутался...

так, сделаем вот такое: я выкатываю билд, в котором substr прошла все заявленные PHP-тесты, а дальше будет видно

JohnDoe

2011-02-01 12:54

updater   bugnote:0006313

>не уверен, что оно полное. я потому и задал здесь вопросы
Довольно полное и последовательное (мы сейчас об http://php.net/manual/en/function.substr.php говорим?)
Вроде как в том описании покрыты все варианты.

JohnDoe

2011-02-01 12:57

updater   bugnote:0006314

>черт, что-то я совсем запутался...
вот-вот, и я про это: имхо полученные удобства не оправдывают всех этих усложнений.
Однако, даже програмист запутался.

Raistlin

2011-02-01 13:06

reporter   bugnote:0006315

> Хотя..., если равняться на PHP, то
> $rest = substr("abcdef", 4, -4); // возвращает ""
А что же оно еще должно возвращать? Начинаем с пятого символа, но убираем 4 с конца. На пересечении не остается ничего, ведь в строке всего 6 символов.

По-моему, тут особо негде путаться. Применяем мысленно AND, и всё.

Описывать все случаи, когда возвращается пустая строка, смысла нет, проще и лучше будет привести примеры, демонстрирующие все варианты.

vskirdin

2011-02-01 14:40

administrator   bugnote:0006317

1805

JohnDoe

2011-02-01 15:09

updater   bugnote:0006318

>1805
В описании функции PHP параметры рассматриваются отдельно, и примеры тоже сгруппираны.
Получается существенно доходчивей.
Предлагаю в Энциклопедии сделать так же.

Raistlin

2011-02-02 09:59

reporter   bugnote:0006323

Потестировал, все хорошо.
Один только момент сработал не так, как я интуитивно ожидал, правда, он и cmd.exe так же работает. Итак:
substr("abcdef",-2,1) == e
substr("abcdef",-1,1) == f
substr("abcdef",-0,1) == a
Оно понятно, что с т. зр. математики -0 и 0 одно и то же, но... в Энциклопедии стоит обратить на это внимание.

vskirdin

2011-02-02 10:09

administrator   bugnote:0006324

> с т. зр. математики -0 и 0 одно и то же, но... в Энциклопедии стоит обратить на это внимание.
Смысл? Разве результат разный?
или ты хочешь, чтобы парсер матерился на "-0"?

Raistlin

2011-02-02 10:17

reporter   bugnote:0006325

Я ожидал, что substr("abcdef",-0,1) == <пусто>
Наверное, не я один такой.
Текущее поведение парсера правильно, просто это тонкий момент.

Raistlin

2011-02-02 10:38

reporter   bugnote:0006326

Хотя нет, на фиг, вычеркнуть из протокола. Никакой это не тонкий момент.
Если N2 >= 0, то это это максимальная длина возвращаемой строки.
Если N2 < 0, то это длина отбрасываемой подстроки, отсчитываемая с конца исходной строки.
И всё.

Issue History

Date Modified Username Field Change
2010-08-30 09:13 JohnDoe New Issue
2010-08-30 09:14 JohnDoe File Added: functions.html.diff
2011-01-25 21:01 Raistlin Note Added: 0006243
2011-01-26 09:36 JohnDoe Note Added: 0006244
2011-01-26 10:54 vskirdin Note Added: 0006245
2011-01-26 11:33 Raistlin Note Added: 0006246
2011-01-26 11:57 JohnDoe Note Added: 0006247
2011-01-26 12:21 Raistlin Note Added: 0006248
2011-01-26 12:51 JohnDoe Note Added: 0006249
2011-01-27 07:52 max rusov Note Added: 0006252
2011-01-27 08:48 Raistlin Note Added: 0006253
2011-01-27 09:20 max rusov Note Added: 0006254
2011-01-27 09:44 JohnDoe Note Added: 0006255
2011-01-27 10:44 max rusov Note Added: 0006256
2011-01-27 11:12 vskirdin Note Added: 0006257
2011-01-27 11:21 JohnDoe Note Added: 0006258
2011-01-27 11:25 JohnDoe Note Edited: 0006258
2011-01-27 11:27 JohnDoe Note Edited: 0006258
2011-01-30 06:41 vskirdin Note Added: 0006272
2011-01-30 11:04 Raistlin Note Added: 0006281
2011-02-01 11:30 vskirdin Note Added: 0006304
2011-02-01 11:47 Raistlin Note Added: 0006305
2011-02-01 11:52 JohnDoe Note Added: 0006306
2011-02-01 11:53 JohnDoe Note Edited: 0006306
2011-02-01 12:16 vskirdin Note Added: 0006310
2011-02-01 12:32 Raistlin Note Added: 0006311
2011-02-01 12:43 vskirdin Assigned To => vskirdin
2011-02-01 12:43 vskirdin Status new => assigned
2011-02-01 12:52 vskirdin Note Added: 0006312
2011-02-01 12:54 JohnDoe Note Added: 0006313
2011-02-01 12:57 JohnDoe Note Added: 0006314
2011-02-01 13:06 Raistlin Note Added: 0006315
2011-02-01 14:40 vskirdin Note Added: 0006317
2011-02-01 14:40 vskirdin Status assigned => feedback
2011-02-01 15:09 JohnDoe Note Added: 0006318
2011-02-01 15:09 JohnDoe Status feedback => assigned
2011-02-02 09:59 Raistlin Note Added: 0006323
2011-02-02 10:05 Raistlin Status assigned => resolved
2011-02-02 10:09 vskirdin Note Added: 0006324
2011-02-02 10:17 Raistlin Note Added: 0006325
2011-02-02 10:38 Raistlin Note Added: 0006326
2011-02-02 15:14 vskirdin Build => 1805
2011-02-02 15:14 vskirdin Status resolved => closed
2011-02-02 15:14 vskirdin Resolution open => fixed
2011-02-02 15:14 vskirdin Fixed in Version => 2.0
2013-02-03 00:34 alexy Severity minor => feature