View Issue Details

IDProjectCategoryView StatusLast Update
0002069WishesMacropublic2013-02-03 00:33
ReporterRaistlin Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Platformx86OSWindowsOS VersionXP SP3
Product Version3.0 
Fixed in Version3.0 
Summary0002069: rep(n,string)
DescriptionПредлагаю добавить в макроязык фунцию rep(n,string) - "вернуть строку из n раз повторенной string".
По материалам rep(n,string).
TagsNo tags attached.
Build2629

Activities

DAtaMan

2012-04-11 13:55

reporter   bugnote:0008871

Last edited: 2012-04-11 13:57

На мой взгляд, такой набор
  PadL(eExpression, nCount[, cPadCharacter])
  PadR(eExpression, nCount[, cPadCharacter])
  PadC(eExpression, nCount[, cPadCharacter]) (cPadCharacter - пробел по-умолчанию)
лучше.

Raistlin

2012-04-11 13:56

reporter   bugnote:0008872

Что есть eExpression?

JohnDoe

2012-04-11 13:57

updater   bugnote:0008873

Last edited: 2012-04-11 13:57

DAtaMan
Надеюсь это сарказм?

DAtaMan

2012-04-11 13:59

reporter   bugnote:0008874

>Что есть eExpression?
Число, строка, выражение...
http://msdn.microsoft.com/en-us/library/aa978112(v=vs.71).aspx

>Надеюсь это сарказм?
Почему это?

vskirdin

2012-04-19 12:52

administrator   bugnote:0008961

>>Что есть eExpression?
>Число, строка, выражение...
а поточнее?
Правильно я понимаю, что:
PadR("foo",7,"*")
вернет "foo****"?
А PadC? Размещает посередине и "падлит"? т.е. "**foo**"
А если nCount меньше длины eExpression?

vskirdin

2012-04-19 13:06

administrator   bugnote:0008962

Вот так:
S=StrPad(V,Cnt[,Fill[,Op]])
v - исходное выражение, если не указано или пусто - считается пустой строкой
cnt - размер результата (если отрицательно или меньше длины V - возвращается V as is, исключение, когда V не указан или его длина равна 0)
Fill - чем заполнять (берется первый символ, если строка многосимвольная, например, Fill=10 - будет происходить заполнение символом "1")
Op - 0 справа, 1 слева, 2 по центру.

ы?

DAtaMan

2012-04-19 13:23

reporter   bugnote:0008964

> S=StrPad(V,Cnt[,Fill[,Op]])
Да, отлично.

> берется первый символ, если строка многосимвольная

А может повторять всю строку до тех пор, пока она укладывается в заданную ширину, и дополнять оставшимися символами?
Тогда в таком виде функция покроет и собственно инц.

vskirdin

2012-04-19 13:30

administrator   bugnote:0008965

Ок. Тогда инц вырождается в
s=strpad(,n,string)

DAtaMan

2012-04-19 13:39

reporter   bugnote:0008967

А как же Op? (справа, слева, по центру)

vskirdin

2012-04-19 14:07

administrator   bugnote:0008968

по умолчанию 0 - т.е. "справа", а т.к. V не указан, то "на всю катушку"

Raistlin

2012-04-19 16:35

reporter   bugnote:0008973

> если отрицательно или меньше длины V - возвращается V as is, исключение, когда > V не указан или его длина равна 0
Почему исключение? Что будет возвращаться в этом случае?

А в целом - устраивает более чем.

vskirdin

2012-04-19 19:02

administrator   bugnote:0008975

если V не указан или длина равна 0, то будет... как у тебя - строка, заполненная чем-то в размере n.
если V указан, то... пляски вокруг него.

Raistlin

2012-04-19 20:33

reporter   bugnote:0008978

Last edited: 2012-04-19 20:49

Если cnt отрицателен или 0, то всегда возвращается V - и в случае, если V опущен, т. е. является пустой строкой, тоже.

vskirdin

2012-04-20 08:13

administrator   bugnote:0008980

build 2629

Raistlin

2012-04-21 19:07

reporter   bugnote:0009000

StrPad("abc",,"*",) возвращает abc. Это IMHO все-таки неверно. Нужно, чтобы cnt однозначно определял длину возвращаемой строки независимо от длины V. Конечно, тут может возникнуть неоднозначность при центрированном обрезании - это надо будет указать в Энциклопедии: например, в этом случае начинаем обрезать всегда справа.

vskirdin

2012-04-22 06:48

administrator   bugnote:0009001

> StrPad("abc",,"*",) возвращает abc
и что не так? возвращать пустую строку, если Cnt не указан?

DAtaMan

2012-04-22 09:16

reporter   bugnote:0009003

> StrPad("abc",,"*",) возвращает abc

И это правильно: "*" повторена ноль раз.

А для обрезания есть другие инструменты. :)

Raistlin

2012-04-22 09:37

reporter   bugnote:0009004

> возвращать пустую строку, если Cnt не указан?
Да. Иначе непонятно, что есть cnt - то ли размер результирующей строки, то ли количество заполняющих символов. Неоднозначность.

> И это правильно: "*" повторена ноль раз.
А при cnt=1? Строка повторена 1 раз - а результат такой же, как при cnt=0.

DAtaMan

2012-04-22 11:02

reporter   bugnote:0009005

> А при cnt=1? Строка повторена 1 раз - а результат такой же, как при cnt=0.
Pad* от M$ работают так же.

Raistlin

2012-04-22 11:08

reporter   bugnote:0009006

>> StrPad("abc",,"*",) возвращает abc
> И это правильно: "*" повторена ноль раз.

StrPad("abc",1,"*",) возвращает abc
И это правильно? "*" повторено 1 раз.

Может, Pad* так и работают, но, на мой взгляд, это нелогичное поведение. Получается, сущность cnt зависит от соотношения длины V и cnt.

DAtaMan

2012-04-22 12:04

reporter   bugnote:0009007

Pad _дополняет_ V до ширины cnt.
Если cnt переименовать в width, то будет логично?

Вам нужна функция Rep, всё же. А StrPad работает стандартно.

Raistlin

2012-04-22 12:20

reporter   bugnote:0009008

Какая разница? Этот параметр сейчас означает то 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"

vskirdin

2012-04-22 17:58

administrator   bugnote:0009009

> StrPad("abc",5,"*",) -> "abc*****"
это уже не Pad, а StrCat

> StrPad("abc",0,"*",) -> ""
это не Pad, а SubStr

Видимо как то так:
"дополнить источник символом '*' до результирующего размера Cnt" (а дальше все зависит от Src, Cnt, длин Src и Fill).

Raistlin

2012-04-22 18:13

reporter   bugnote:0009010

Cnt сейчас в общем случае - не размер результирующей строки и не количество повторений Fill. Описание cnt невозможно формализовать - только на примерах. Причем, в отличие от описания substr(), где примеры только помогают понять, здесь без них вообще не разберешься. Такие вещи язык точно не украшают.

Даже если M$ сделала у себя так - это лишь означает, что M$ плохо подумала.

vskirdin

2012-04-23 03:30

administrator   bugnote:0009011

Твоя задача решаема вот так: s=strpad(,n,string).
Или "за державу душой болеешь"? ;-)

Raistlin

2012-04-23 07:46

reporter   bugnote:0009013

Естественно, болею :-)

DAtaMan

2012-04-23 08:13

reporter   bugnote:0009014

В PHP тоже так: http://www.w3schools.com/php/func_string_str_pad.asp
:-)

vskirdin

2012-04-23 09:07

administrator   bugnote:0009015

Значит нужно вменяемое описание...
http://farmanager.com/svn/trunk/enc/enc_rus3.work/meta/macro/macrocmd/prop_func/general.html

DAtaMan

2012-04-23 09:37

reporter   bugnote:0009016

Last edited: 2012-04-23 09:52

Наверное, Cnt лучше переименовать в Len.
Переделав http://www.php.net/manual/ru/function.str-pad.php, получилось так:

Функция возвращает строку V, дополненную слева, справа или с обеих сторон до заданной длины. Если не задана строка Fill, то V будет дополнена пробелами, иначе она будет дополнена символами из Fill до нужной длины.
Fill может быть урезана, если необходимое количество дополняемых символов не делится нацело на длину строки Fill.
Если значение Len отрицательно, меньше или равно длине входной строки, то дополнения не происходит.

UPD: Либо и в исходниках Cnt заменить на Size

vskirdin

2012-04-23 09:55

administrator   bugnote:0009017

В целом гуд, только не сказано про тот факт, что V может быть пустой строкой (или отсутствовать)

DAtaMan

2012-04-23 10:34

reporter   bugnote:0009018

Last edited: 2012-04-23 10:58

Функция возвращает строку V, дополненную слева, справа или с обеих сторон (в зависимости от параметра Op) до заданной длины Size символами из строки Fill.
Op Описание
0 V дополняется слева
1 V дополняется справа (по-умолчанию)
2 V дополняется c обеих сторон

Если значение Size отрицательно, меньше или равно длине строки V, то дополнения не происходит.
Если не задана строка Fill, то V будет дополнена пробелами, иначе она будет дополнена символами из Fill до длины Size.
Если параметр V не задан или равен пустой строке, то функция повторяет Fill до тех пор, пока длина результирующей строки меньше длины Size.
Если необходимое количество дополняемых символов не делится нацело на длину строки Fill, то Fill может быть урезана.

Raistlin

2012-04-23 11:46

reporter   bugnote:0009019

Last edited: 2012-04-23 11:50

ОК.

Предлагаю такой вариант описания:

Функция возвращает строку V, дополненную до заданной длины Size строкой Fill. Способ дополнения зависит от параметра Op:
- при Op=0 - слева;
- при Op=1 - справа;
- при Op=2 - c обеих сторон.

Если Size меньше или равно длине V, то дополнения не происходит (возвращается V). Если Fill не задана, то V дополняется пробелами.
Если разность Size и длины V не делится без остатка на длину Fill, дополняющая строка обрезается справа. При Op=2 обрезаются обе части дополняющей строки, первой обрезается левая часть.

Упоминать отдельно о том, что V может быть пустой или не указана, а также о том, что по умолчанию Op принимается за 0, необязательно - ведь это, ЕМНИП, общее правило для всех функций.

JohnDoe

2012-04-23 12:33

updater   bugnote:0009020

>ведь это, ЕМНИП, общее правило для всех функций.
А об этом уже где-то сказано?

Raistlin

2012-04-23 13:03

reporter   bugnote:0009022

По-моему, в changelog'е упоминалось. А еще - не ты ли был сторонником того, чтобы даже стартовые значения параметров функций внизу страницы давать? Вот тут как раз этому принципу место - написать большими буквами на первой странице Энциклопедии, и дело с концом.

Кстати: даже если об этом нигде не упоминать, очевидно, что V может быть пустой строкой - а почему, собственно, ей не мочь?

JohnDoe

2012-04-23 13:53

updater   bugnote:0009023

Last edited: 2012-04-23 13:54

>написать большими буквами
Вначале надо написать, а потом уже ссылаться как на "общее правило".

>по умолчанию Op принимается за 0
Обратите внимание что так не везде.

Raistlin

2012-04-23 14:24

reporter   bugnote:0009026

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

JohnDoe

2012-04-23 18:01

updater   bugnote:0009033

если в описании функции не указано иное

Raistlin

2012-04-23 18:36

reporter   bugnote:0009036

А, прошу прощения, ступил - перепутал со значением необъявленной переменной.

Тогда так:
-----------------------------
Функция возвращает строку 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"
-----------------------------

vskirdin

2012-04-25 13:21

administrator   bugnote:0009053

обновил описание.

Issue History

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