View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002069 | Wishes | Macro | public | 2012-04-11 13:50 | 2013-02-03 00:33 |
Reporter | Raistlin | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP3 |
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0002069: rep(n,string) | ||||
Description | Предлагаю добавить в макроязык фунцию rep(n,string) - "вернуть строку из n раз повторенной string". По материалам rep(n,string). | ||||
Tags | No tags attached. | ||||
Build | 2629 | ||||
|
На мой взгляд, такой набор PadL(eExpression, nCount[, cPadCharacter]) PadR(eExpression, nCount[, cPadCharacter]) PadC(eExpression, nCount[, cPadCharacter]) (cPadCharacter - пробел по-умолчанию) лучше. |
|
Что есть eExpression? |
|
DAtaMan Надеюсь это сарказм? |
|
>Что есть eExpression? Число, строка, выражение... http://msdn.microsoft.com/en-us/library/aa978112(v=vs.71).aspx >Надеюсь это сарказм? Почему это? |
|
>>Что есть eExpression? >Число, строка, выражение... а поточнее? Правильно я понимаю, что: PadR("foo",7,"*") вернет "foo****"? А PadC? Размещает посередине и "падлит"? т.е. "**foo**" А если nCount меньше длины eExpression? |
|
Вот так: S=StrPad(V,Cnt[,Fill[,Op]]) v - исходное выражение, если не указано или пусто - считается пустой строкой cnt - размер результата (если отрицательно или меньше длины V - возвращается V as is, исключение, когда V не указан или его длина равна 0) Fill - чем заполнять (берется первый символ, если строка многосимвольная, например, Fill=10 - будет происходить заполнение символом "1") Op - 0 справа, 1 слева, 2 по центру. ы? |
|
> S=StrPad(V,Cnt[,Fill[,Op]]) Да, отлично. > берется первый символ, если строка многосимвольная А может повторять всю строку до тех пор, пока она укладывается в заданную ширину, и дополнять оставшимися символами? Тогда в таком виде функция покроет и собственно инц. |
|
Ок. Тогда инц вырождается в s=strpad(,n,string) |
|
А как же Op? (справа, слева, по центру) |
|
по умолчанию 0 - т.е. "справа", а т.к. V не указан, то "на всю катушку" |
|
> если отрицательно или меньше длины V - возвращается V as is, исключение, когда > V не указан или его длина равна 0 Почему исключение? Что будет возвращаться в этом случае? А в целом - устраивает более чем. |
|
если V не указан или длина равна 0, то будет... как у тебя - строка, заполненная чем-то в размере n. если V указан, то... пляски вокруг него. |
|
Если cnt отрицателен или 0, то всегда возвращается V - и в случае, если V опущен, т. е. является пустой строкой, тоже. |
|
build 2629 |
|
StrPad("abc",,"*",) возвращает abc. Это IMHO все-таки неверно. Нужно, чтобы cnt однозначно определял длину возвращаемой строки независимо от длины V. Конечно, тут может возникнуть неоднозначность при центрированном обрезании - это надо будет указать в Энциклопедии: например, в этом случае начинаем обрезать всегда справа. |
|
> StrPad("abc",,"*",) возвращает abc и что не так? возвращать пустую строку, если Cnt не указан? |
|
> StrPad("abc",,"*",) возвращает abc И это правильно: "*" повторена ноль раз. А для обрезания есть другие инструменты. :) |
|
> возвращать пустую строку, если Cnt не указан? Да. Иначе непонятно, что есть cnt - то ли размер результирующей строки, то ли количество заполняющих символов. Неоднозначность. > И это правильно: "*" повторена ноль раз. А при cnt=1? Строка повторена 1 раз - а результат такой же, как при cnt=0. |
|
> А при cnt=1? Строка повторена 1 раз - а результат такой же, как при cnt=0. Pad* от M$ работают так же. |
|
>> StrPad("abc",,"*",) возвращает abc > И это правильно: "*" повторена ноль раз. StrPad("abc",1,"*",) возвращает abc И это правильно? "*" повторено 1 раз. Может, Pad* так и работают, но, на мой взгляд, это нелогичное поведение. Получается, сущность cnt зависит от соотношения длины V и cnt. |
|
Pad _дополняет_ V до ширины cnt. Если cnt переименовать в width, то будет логично? Вам нужна функция Rep, всё же. А StrPad работает стандартно. |
|
Какая разница? Этот параметр сейчас означает то cnt, то width. Как ни переименовывай - эта переменчивость останется. Если это width, то должно быть: StrPad("abc",5,"*",) -> "abc**" StrPad("abc",0,"*",) -> "" Если это cnt, то должно быть: StrPad("abc",5,"*",) -> "abc*****" StrPad("abc",0,"*",) -> "abc" А сейчас: StrPad("abc",5,"*",) -> "abc**" StrPad("abc",0,"*",) -> "abc" |
|
> StrPad("abc",5,"*",) -> "abc*****" это уже не Pad, а StrCat > StrPad("abc",0,"*",) -> "" это не Pad, а SubStr Видимо как то так: "дополнить источник символом '*' до результирующего размера Cnt" (а дальше все зависит от Src, Cnt, длин Src и Fill). |
|
Cnt сейчас в общем случае - не размер результирующей строки и не количество повторений Fill. Описание cnt невозможно формализовать - только на примерах. Причем, в отличие от описания substr(), где примеры только помогают понять, здесь без них вообще не разберешься. Такие вещи язык точно не украшают. Даже если M$ сделала у себя так - это лишь означает, что M$ плохо подумала. |
|
Твоя задача решаема вот так: s=strpad(,n,string). Или "за державу душой болеешь"? ;-) |
|
Естественно, болею :-) |
|
В PHP тоже так: http://www.w3schools.com/php/func_string_str_pad.asp :-) |
|
Значит нужно вменяемое описание... http://farmanager.com/svn/trunk/enc/enc_rus3.work/meta/macro/macrocmd/prop_func/general.html |
|
Наверное, Cnt лучше переименовать в Len. Переделав http://www.php.net/manual/ru/function.str-pad.php, получилось так: Функция возвращает строку V, дополненную слева, справа или с обеих сторон до заданной длины. Если не задана строка Fill, то V будет дополнена пробелами, иначе она будет дополнена символами из Fill до нужной длины. Fill может быть урезана, если необходимое количество дополняемых символов не делится нацело на длину строки Fill. Если значение Len отрицательно, меньше или равно длине входной строки, то дополнения не происходит. UPD: Либо и в исходниках Cnt заменить на Size |
|
В целом гуд, только не сказано про тот факт, что V может быть пустой строкой (или отсутствовать) |
|
Функция возвращает строку V, дополненную слева, справа или с обеих сторон (в зависимости от параметра Op) до заданной длины Size символами из строки Fill. Op Описание 0 V дополняется слева 1 V дополняется справа (по-умолчанию) 2 V дополняется c обеих сторон Если значение Size отрицательно, меньше или равно длине строки V, то дополнения не происходит. Если не задана строка Fill, то V будет дополнена пробелами, иначе она будет дополнена символами из Fill до длины Size. Если параметр V не задан или равен пустой строке, то функция повторяет Fill до тех пор, пока длина результирующей строки меньше длины Size. Если необходимое количество дополняемых символов не делится нацело на длину строки Fill, то Fill может быть урезана. |
|
ОК. Предлагаю такой вариант описания: Функция возвращает строку V, дополненную до заданной длины Size строкой Fill. Способ дополнения зависит от параметра Op: - при Op=0 - слева; - при Op=1 - справа; - при Op=2 - c обеих сторон. Если Size меньше или равно длине V, то дополнения не происходит (возвращается V). Если Fill не задана, то V дополняется пробелами. Если разность Size и длины V не делится без остатка на длину Fill, дополняющая строка обрезается справа. При Op=2 обрезаются обе части дополняющей строки, первой обрезается левая часть. Упоминать отдельно о том, что V может быть пустой или не указана, а также о том, что по умолчанию Op принимается за 0, необязательно - ведь это, ЕМНИП, общее правило для всех функций. |
|
>ведь это, ЕМНИП, общее правило для всех функций. А об этом уже где-то сказано? |
|
По-моему, в changelog'е упоминалось. А еще - не ты ли был сторонником того, чтобы даже стартовые значения параметров функций внизу страницы давать? Вот тут как раз этому принципу место - написать большими буквами на первой странице Энциклопедии, и дело с концом. Кстати: даже если об этом нигде не упоминать, очевидно, что V может быть пустой строкой - а почему, собственно, ей не мочь? |
|
>написать большими буквами Вначале надо написать, а потом уже ссылаться как на "общее правило". >по умолчанию Op принимается за 0 Обратите внимание что так не везде. |
|
> Обратите внимание что так не везде. Опущенное числовое значение эквивалентно указанию нулевого значения, разве нет? |
|
если в описании функции не указано иное |
|
А, прошу прощения, ступил - перепутал со значением необъявленной переменной. Тогда так: ----------------------------- Функция возвращает строку V, дополненную до заданной длины Size строкой Fill (по умолчанию - пробелами). Если Size меньше или равна длине V либо опущена, то дополнения не происходит (возвращается V). Способ дополнения зависит от параметра Op: - при Op=0 - справа (по умолчанию); - при Op=1 - слева; - при Op=2 - c обеих сторон. Если разность Size и длины V не делится без остатка на длину Fill, дополняющая строка обрезается справа. Примеры: StrPad(,5,"*") возвращает "*****" StrPad("abc",4) возвращает "abc " StrPad("abc",,"*") возвращает "abc" StrPad("123",10,"abcdefghi",2) возвращает "abc123abcd" ----------------------------- |
|
обновил описание. |
Date Modified | Username | Field | Change |
---|---|---|---|
2012-04-11 13:50 | Raistlin | New Issue | |
2012-04-11 13:55 | DAtaMan | Note Added: 0008871 | |
2012-04-11 13:56 | Raistlin | Note Added: 0008872 | |
2012-04-11 13:57 | JohnDoe | Note Added: 0008873 | |
2012-04-11 13:57 | JohnDoe | Note Edited: 0008873 | |
2012-04-11 13:57 | DAtaMan | Note Edited: 0008871 | |
2012-04-11 13:59 | DAtaMan | Note Added: 0008874 | |
2012-04-19 12:52 | vskirdin | Note Added: 0008961 | |
2012-04-19 13:06 | vskirdin | Note Added: 0008962 | |
2012-04-19 13:23 | DAtaMan | Note Added: 0008964 | |
2012-04-19 13:30 | vskirdin | Note Added: 0008965 | |
2012-04-19 13:39 | DAtaMan | Note Added: 0008967 | |
2012-04-19 14:07 | vskirdin | Note Added: 0008968 | |
2012-04-19 16:35 | Raistlin | Note Added: 0008973 | |
2012-04-19 19:02 | vskirdin | Note Added: 0008975 | |
2012-04-19 20:33 | Raistlin | Note Added: 0008978 | |
2012-04-19 20:49 | Raistlin | Note Edited: 0008978 | |
2012-04-20 08:13 | vskirdin | Note Added: 0008980 | |
2012-04-20 08:13 | vskirdin | Assigned To | => vskirdin |
2012-04-20 08:13 | vskirdin | Status | new => feedback |
2012-04-21 19:07 | Raistlin | Note Added: 0009000 | |
2012-04-21 19:07 | Raistlin | Status | feedback => assigned |
2012-04-22 06:48 | vskirdin | Note Added: 0009001 | |
2012-04-22 09:16 | DAtaMan | Note Added: 0009003 | |
2012-04-22 09:37 | Raistlin | Note Added: 0009004 | |
2012-04-22 11:02 | DAtaMan | Note Added: 0009005 | |
2012-04-22 11:08 | Raistlin | Note Added: 0009006 | |
2012-04-22 12:04 | DAtaMan | Note Added: 0009007 | |
2012-04-22 12:20 | Raistlin | Note Added: 0009008 | |
2012-04-22 17:58 | vskirdin | Note Added: 0009009 | |
2012-04-22 18:13 | Raistlin | Note Added: 0009010 | |
2012-04-23 03:30 | vskirdin | Note Added: 0009011 | |
2012-04-23 07:46 | Raistlin | Note Added: 0009013 | |
2012-04-23 08:13 | DAtaMan | Note Added: 0009014 | |
2012-04-23 09:07 | vskirdin | Note Added: 0009015 | |
2012-04-23 09:37 | DAtaMan | Note Added: 0009016 | |
2012-04-23 09:52 | DAtaMan | Note Edited: 0009016 | |
2012-04-23 09:55 | vskirdin | Note Added: 0009017 | |
2012-04-23 10:34 | DAtaMan | Note Added: 0009018 | |
2012-04-23 10:58 | DAtaMan | Note Edited: 0009018 | |
2012-04-23 11:46 | Raistlin | Note Added: 0009019 | |
2012-04-23 11:46 | Raistlin | Note Edited: 0009019 | |
2012-04-23 11:49 | Raistlin | Note Edited: 0009019 | |
2012-04-23 11:50 | Raistlin | Note Edited: 0009019 | |
2012-04-23 12:33 | JohnDoe | Note Added: 0009020 | |
2012-04-23 13:03 | Raistlin | Note Added: 0009022 | |
2012-04-23 13:53 | JohnDoe | Note Added: 0009023 | |
2012-04-23 13:54 | JohnDoe | Note Edited: 0009023 | |
2012-04-23 14:24 | Raistlin | Note Added: 0009026 | |
2012-04-23 18:01 | JohnDoe | Note Added: 0009033 | |
2012-04-23 18:36 | Raistlin | Note Added: 0009036 | |
2012-04-25 13:21 | vskirdin | Note Added: 0009053 | |
2012-04-25 13:21 | vskirdin | Status | assigned => feedback |
2012-04-26 09:24 | Raistlin | Status | feedback => resolved |
2012-04-26 09:48 | vskirdin | Build | => 2629 |
2012-04-26 09:48 | vskirdin | Status | resolved => closed |
2012-04-26 09:48 | vskirdin | Resolution | open => fixed |
2012-04-26 09:48 | vskirdin | Fixed in Version | => 3.0 |
2013-02-03 00:33 | alexy | Severity | minor => feature |