View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001480 | Wishes | Macro | public | 2010-08-30 09:13 | 2013-02-03 00:34 |
Reporter | JohnDoe | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Fixed in Version | 2.0 | ||||
Summary | 0001480: Расширить 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. | ||||
Tags | No tags attached. | ||||
Build | 1805 | ||||
|
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> |
|
Поддерживаю и предлагаю дополнительно: если N2<0, то возвращаем подстроку от N1 до символа N2 от конца строки. То есть как в cmd.exe: C:\>echo %windir% C:\WINDOWS C:\>echo %windir:~3,-1% WINDOW C:\>echo %windir:~-3,-1% OW |
|
Raistlin Мне кажется это пожелание заслуживает отдельного обсуждения |
|
в собачьем языке Lotus`а есть аналогичные функции (несколько) |
|
> Мне кажется это пожелание заслуживает отдельного обсуждения А смысл их множить? И в том, и в другом случае идет речь об использовании потенциальных возможностей синтаксиса, которые сейчас просто простаивают. |
|
Смысл в том, что предлагаемые изменения могут быть реализованы независимо друг от друга. Я пока не уверен, что ваше предложение что-то упростит. Вгляните на теперешнее короткое и понятное определение функции. Там чётко и недвусмысленно сказано, что N2 это длина подстроки. Если же посмотреть хелп cmd (set/?), то там нормального определения вообще нет, есть только примеры использования. В общем, не очень это прямо, когда в одном случае N2 это "длина", а в другом "непонятно что". Выкрутасы cmd я ещё могу понять, ведь там весьма ограниченные возможности работы со строками, и по-другому это не сделаешь. |
|
> Я пока не уверен, что ваше предложение что-то упростит. Я нашел этот инцидент, когда хотел создать новый по материалам http://forum.farmanager.com/viewtopic.php?f=15&t=6076 Там неоднократно звучала мысль, что слеш в конце - это хорошо, но вот отрезать при необходимости его замучаешься. Если реализовать мое пожелание, то все сильно упростится. Думаю, это не единственный пример, когда такое расширение функционала пригодилось бы. > Вгляните на теперешнее короткое и понятное определение функции. Там чётко и недвусмысленно сказано, что N2 это длина подстроки. Предлагаемое расширение функционала можно не менее четко и недвусмысленно описать: если N2>=0, то длина подстроки если N2<0, то номер конечного символа подстроки, отсчитываемый с конца исходной строки >там нормального определения вообще нет, есть только примеры использования И это очень правильно! Хороший, четкий и недвусмысленный пример (там, правда, не очень такой) всегда лучше, чем пространное описание. >Выкрутасы cmd я ещё могу понять, ведь там весьма ограниченные возможности работы со строками Так зачем уподобляться ему и заставлять пользователя выкрутасничать с len() там, где можно обойтись одним substr()? |
|
Это странно и не интуитивно, что изменение знака N2 меняет его сущность: положительное N2 это "длина", а отрицательное... (Даже не знаю как сформулировать, но одним словом точно не обойтись.) Впрочем, пусть другие выскажутся. Может и правда есть нормальные языки, где такое принято. |
|
Довольно удобно сделано в PHP http://php.net/manual/en/function.substr.php |
|
>Довольно удобно сделано в PHP В точности так, как предлагается здесь. Поправка к моему описанию: если N2>=0, то возвращаемая подстрока будет состоять максимум из N2 символов исходной строки начиная с N1 если N2<0, то в возвращаемой подстроке будет отсутствовать N2 символов от конца исходной строки, при том, что она будет начинаться с символа N1. Или: N2 - длина того, что берем (если >=0) или отбрасываем (если <0). |
|
> В точности так, как предлагается здесь. Ну, я и привел ссылку, чтобы показать что это все не отсебятина, а вполне себе стандартно. |
|
Если не отсебятина, то пускай. Только вот с одной стороны упрощаем, а с другой... Я прикинул, что описание в Энциклопедии увеличивается в 7 раз. |
|
Так, вроде, это же Ваша идея (расширить substr) |
|
хмм... т.е. реализовать предлагается мне? или кто-то сподобится на патч? ;-) |
|
Идея (изначально не моя, а с форума) касалась уточнения только одного параметра, и в Энциклопедию это добавляло всего 1 строчку. Но я уже как бы не сильно против того как в PHP. Edit: Патч - не :( Однако, програмист нужен (с) |
|
Ок, в разделе "Подробности" все верно и полно написано? Или что-то нужно исправить в описании... (а то я ж ленивый и не буду перечитывать все обсуждение :-)) |
|
В Подробностях только пожелание от John Doe, мое как раз в обсуждении. В общем, сделай, пож., так, как в PHP: http://php.net/manual/en/function.substr.php |
|
Ну, помогайте :-) 1) Здесь все правильно написано? * если start >= 0, то вернётся подстрока, начиная со start-символа от начала строки. * если start < 0, то вернётся подстрока, начиная со start-символа от конца строки. * если length > 0, то возвращаемая подстрока будет состоять максимум из length символов исходной строки начиная с start * если length < 0, то в возвращаемой подстроке будет отсутствовать length символов от конца исходной строки, при том, что она будет начинаться с символа start. 2) так же просьба дополнить утверждения про пустую строку пустая строка возвращается: * если length = 0 * если... 3) А в каком случае возвращается _ВСЯ_ строка? |
|
1. Да, учитывая, что при start < 0 start-символ берется от конца строки. 2. Пустая только при length = 0. 3. Вся строка возвращается, если start=0 и length опущен. В более общем случае: если length опущен, возвращаем все, начиная со start. |
|
>2. Пустая только при length = 0. и в случаях типа start=len Описание для Энциклопедии предлагаю полностью взять из PHP. Вместе со всеми примерами. |
|
ну для (2) я бы еще добавил следующее... (вот как только описать?) * если в результате внутренних вычислений start оказывается за пределами строки (влево или вправо, пофигу). > Описание для Энциклопедии предлагаю полностью взять из PHP. не уверен, что оно полное. я потому и задал здесь вопросы |
|
> если в результате внутренних вычислений start оказывается за пределами строки (влево или вправо, пофигу). Если влево, то не по фигу, должны вернуть непустую при достаточно большом length: C:\>echo %windir:~-20,40% C:\WINDOWS |
|
правильно я понимаю, что... пустая строка возвращается: * если length = 0 * если start+length > длины_строки Хотя..., если равняться на PHP, то $rest = substr("abcdef", 4, -4); // возвращает "" черт, что-то я совсем запутался... так, сделаем вот такое: я выкатываю билд, в котором substr прошла все заявленные PHP-тесты, а дальше будет видно |
|
>не уверен, что оно полное. я потому и задал здесь вопросы Довольно полное и последовательное (мы сейчас об http://php.net/manual/en/function.substr.php говорим?) Вроде как в том описании покрыты все варианты. |
|
>черт, что-то я совсем запутался... вот-вот, и я про это: имхо полученные удобства не оправдывают всех этих усложнений. Однако, даже програмист запутался. |
|
> Хотя..., если равняться на PHP, то > $rest = substr("abcdef", 4, -4); // возвращает "" А что же оно еще должно возвращать? Начинаем с пятого символа, но убираем 4 с конца. На пересечении не остается ничего, ведь в строке всего 6 символов. По-моему, тут особо негде путаться. Применяем мысленно AND, и всё. Описывать все случаи, когда возвращается пустая строка, смысла нет, проще и лучше будет привести примеры, демонстрирующие все варианты. |
|
1805 |
|
>1805 В описании функции PHP параметры рассматриваются отдельно, и примеры тоже сгруппираны. Получается существенно доходчивей. Предлагаю в Энциклопедии сделать так же. |
|
Потестировал, все хорошо. Один только момент сработал не так, как я интуитивно ожидал, правда, он и cmd.exe так же работает. Итак: substr("abcdef",-2,1) == e substr("abcdef",-1,1) == f substr("abcdef",-0,1) == a Оно понятно, что с т. зр. математики -0 и 0 одно и то же, но... в Энциклопедии стоит обратить на это внимание. |
|
> с т. зр. математики -0 и 0 одно и то же, но... в Энциклопедии стоит обратить на это внимание. Смысл? Разве результат разный? или ты хочешь, чтобы парсер матерился на "-0"? |
|
Я ожидал, что substr("abcdef",-0,1) == <пусто> Наверное, не я один такой. Текущее поведение парсера правильно, просто это тонкий момент. |
|
Хотя нет, на фиг, вычеркнуть из протокола. Никакой это не тонкий момент. Если N2 >= 0, то это это максимальная длина возвращаемой строки. Если N2 < 0, то это длина отбрасываемой подстроки, отсчитываемая с конца исходной строки. И всё. |
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 |