Что нового

Форматирование длинной строки пирамидкой или ромбиком

Suppir

Продвинутый
Сообщения
967
Репутация
62
Привет!

Есть функция, которая форматирует длинную строку пирамидкой:

Код:
$line1 = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
$line2 = 'Постановление администрации муниципального образования город Краснодар от 19 января 2011 г. N 194 “О внесении изменений в постановление главы муниципального образования город Краснодар от 26.11.2008 N 4062 “Об утверждении Положения о порядке работы комиссий по выявлению и уборке автотранспортных средств, брошенных собственниками, на территории муниципального образования город Краснодар и об организации мероприятий, направленных на принятие мер по уборке автотранспортных средств, брошенных собственниками"'

MsgBox(0, '', Pyra($line1, 70))
MsgBox(0, '', Pyra($line2, 70))

Func Pyra($sLine, $iMaxLen)
    Local $aSplittedLine = StringSplit($sLine, ' ')
    Local $sRet, $sNewLine
    For $i = 1 To $aSplittedLine[0] Step +1
        If StringLen($sNewLine & ' ' & $aSplittedLine[$i]) <= $iMaxLen Then
            $sNewLine &= ' ' & $aSplittedLine[$i]
        Else
            $sRet &= $sNewLine & @CRLF
            $iMaxLen = StringLen($sNewLine) -1
            $sNewLine = $aSplittedLine[$i]
        EndIf
    Next
    $sRet &= $sNewLine
    Return StringStripWS($sRet, 1)
EndFunc



На строке $line1 это работает нормально. Но если строка достаточно длинная как $line2, то результат выглядит некрасиво. Как сделать так, чтобы короткие строки форматировались пирамидкой, а длинные - ромбиком?

т.е. вот так должно быть:

пирамидка
Информация региональной энергетической комиссии - департамента цен и тарифов
Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов
Краснодарского края на автомобильное топливо на период
3 квартала 2010 года​

ромбик
Постановление администрации муниципального образования город Краснодар
от 19 января 2011 г. N 194 “О внесении изменений в постановление главы муниципального
образования город Краснодар от 26.11.2008 N 4062 “Об утверждении Положения о порядке работы комиссий
по выявлению и уборке автотранспортных средств, брошенных собственниками, на территории
муниципального образования город Краснодар и об организации мероприятий,
направленных на принятие мер по уборке автотранспортных средств,
брошенных собственниками"​


Добавлено:
Сообщение автоматически объединено:

Для упрощения задачи положим, что максимальная длина строки всегда равна 70 и меняться не может. А максимальная длина входной строки не превышает 1000 знаков.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
$line1 = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
$line2 = 'Постановление администрации муниципального образования город Краснодар от 19 января 2011 г. N 194 “О внесении изменений в постановление главы муниципального образования город Краснодар от 26.11.2008 N 4062 “Об утверждении Положения о порядке работы комиссий по выявлению и уборке автотранспортных средств, брошенных собственниками, на территории муниципального образования город Краснодар и об организации мероприятий, направленных на принятие мер по уборке автотранспортных средств, брошенных собственниками"'

MsgBox(0, '', Pyra($line1, 70))
MsgBox(0, '', Pyra($line2, 70))

Func Pyra($sLine, $iMaxLen)
    Local $aSplittedLine = StringSplit($sLine, ' ')
    Local $sRet, $sNewLine
    For $i = 1 To $aSplittedLine[0] Step +1
        If StringLen($sNewLine & ' ' & $aSplittedLine[$i]) <= $iMaxLen Then
            $sNewLine &= ' ' & $aSplittedLine[$i]
        ElseIf StringLen($sNewLine & ' ' & $aSplittedLine[$i]) = $iMaxLen Then
            $sRet &= $sNewLine & @CRLF
            $iMaxLen = StringLen($sNewLine) - 1
            $sNewLine = $aSplittedLine[$i]
		Else
            $sRet &= $sNewLine & @CRLF
            $iMaxLen = StringLen($sNewLine) + 1
            $sNewLine = $aSplittedLine[$i]
        EndIf
    Next
    $sRet &= $sNewLine
	ClipPut(StringStripWS($sRet, 1))
    Return StringStripWS($sRet, 1)
EndFunc


Так подойдёт?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr

так ромбик же не формируется.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Suppir сказал(а):
SyDr
так ромбик же не формируется.
Плохо прочитал. Извиняй :smile:

Ромбик тоже не во всех случаях можно сформировать. Сейчас подумаю над задачей :smile:


Добавлено:
Сообщение автоматически объединено:

Код:
$line1 = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
$line2 = 'Надо сказать, что поставленная задача была решена очень профессионально. Созданная библиотека предоставляет окна, блоки диалого, контексты устройств, общие обьекты GDI, такие как битовые образы и кисти, элементы управления и многие другие стандартные элементы Windows. Основа программирования для Windows – обработка событий – представлена программистам в удобном и привычном виде. Классы библиотеки полностью вобрали в себя многочисленные операторы switch, которые так загромождают программы, написанные на С. Наряду с этим, совершенно свободно использовать как вызовы библиотеки классов, так и прямые вызовы Win32 API. Кроме того, за сравнительно небольшой промежуток времени корпорацией Miсrosoft было разработано несколько версий Microsoft Foundation Classes, которая становилась все мощнее и удобнее. Есть все основания считать, что развитие не остановится и на версии 4.1. К тому же поддержка другими компаниями в рамках своих компиляторов и средств разработки программного обеспечения именно Microsoft Foundation Classes, а не OWL фирмы Borland позволяет сконцентрироваться на Microsoft Foundation Classes"'

MsgBox(0, '', PyraS($line1, 70))
MsgBox(0, '', PyraS($line2, 70))

Func PyraS($sData, $iMaxLen)
	Local $asData = StringSplit($sData, ' ')
	Local $sReturn = ""
	Local $iCurMaxLen = $iMaxLen
	Local $iDirection = -1
	local $iCount = 1, $iCurrent = 0

	While $iCount <= $asData[0]
;~ 		MsgBox(0, Default, "$iCurrent: " & $iCurrent & @CRLF & "StringLen($asData[$iCount])): " & StringLen($asData[$iCount]) & _
;~ 		@CRLF & "$iDirection: " & $iDirection & @CRLF & "$iCurMaxLen: " & $iCurMaxLen & @CRLF & $sReturn)
		If $iDirection = -1 Then
			If $iCurrent + StringLen($asData[$iCount]) + 1 <= $iCurMaxLen Then
				$iCurrent += StringLen($asData[$iCount]) + 1
				$sReturn &= $asData[$iCount] & " "
				$iCount += 1
			ElseIf $iCurrent = 0 Then
				$iDirection = 1
			Else
				$sReturn &= @CRLF
				$iCurMaxLen = $iCurrent - 1
				$iCurrent = 0
			EndIf
		Else
			If $iCurrent + StringLen($asData[$iCount]) >= $iCurMaxLen Then
				$iCurrent += StringLen($asData[$iCount]) + 1
				$sReturn &= $asData[$iCount] & " "
				$iCount += 1
				$sReturn &= @CRLF
				$iCurMaxLen = $iCurrent + $iDirection
				If $iCurMaxLen >= $iMaxLen Then
					$iCurMaxLen = $iMaxLen
					$iDirection = -1
				EndIf
				$iCurrent = 0
			Else
				$iCurrent += StringLen($asData[$iCount]) + 1
				$sReturn &= $asData[$iCount] & " "
				$iCount += 1
			EndIf
		EndIf
	WEnd
	Return $sReturn
EndFunc


Результат:
Надо сказать, что поставленная задача была решена очень
профессионально. Созданная библиотека предоставляет
окна, блоки диалого, контексты устройств, общие
обьекты GDI, такие как битовые образы и кисти,
элементы управления и многие другие
стандартные элементы Windows.
Основа программирования для
Windows – обработка
событий –
представлена
программистам в
удобном и привычном
виде. Классы библиотеки
полностью вобрали в себя многочисленные
операторы switch, которые так загромождают
программы, написанные на С. Наряду с этим, совершенно
свободно использовать как вызовы библиотеки классов, так
и прямые вызовы Win32 API. Кроме того, за сравнительно небольшой
промежуток времени корпорацией Miсrosoft было разработано несколько
версий Microsoft Foundation Classes, которая становилась все мощнее и
удобнее. Есть все основания считать, что развитие не остановится и на
версии 4.1. К тому же поддержка другими компаниями в рамках своих
компиляторов и средств разработки программного обеспечения
именно Microsoft Foundation Classes, а не OWL фирмы
Borland позволяет сконцентрироваться на Microsoft
Foundation Classes"​

Суть: длина строки уменьшается до минимально возможной, после чего растёт обратно до максимально возможной и так туда-сюда. Особенность: в каждой возвращаемой строке в конце лишний пробел. Его можно убрать. Максмальная длина в параметре также учитывает этот пробел: то есть, если в результате надо получить строки длиной не более 70 символов, и пробел в конце каждой строки будет удалён, необходимо указать 71 в качестве параметра.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr

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

В идеале нужно, как у меня в первом посте нарисовано. Т.е. если изначально длина больше определенной строки, то нужно "расти" пирамидку, а потом (когда останется 200 - 300 символов), уменьшать ее. В итоге получится ромбик. Если же длина изначально подходит для укладывавания в пирамидку, то сразу уменьшать.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Мммм... Нифига не понятно с твоим ромбиком.
Давай так, если получается, то ответ нужен примерно такой (длины строк):
Пирамидка
70
60
50
40
30
...​

Ромбик:
С какой минимальной длины строки он должен начинаться?
Нарисуй в числах.

Такое подойдёт, или же нужно, чтобы был именно ромбик, т.е. снчала длина строки только увеличивается, потом только уменьшается?

Надо
сказать,
что поставленная
задача была решена
очень профессионально.
Созданная библиотека предоставляет
окна, блоки диалого, контексты устройств,
общие обьекты GDI, такие как битовые образы
и кисти, элементы управления и многие другие стандартные
элементы Windows. Основа программирования для Windows – обработка
событий – представлена программистам в удобном и привычном виде. Классы
библиотеки полностью вобрали в себя многочисленные операторы switch,
которые так загромождают программы, написанные на С. Наряду с этим,
совершенно свободно использовать как вызовы библиотеки классов,
так и прямые вызовы Win32 API. Кроме того, за сравнительно
небольшой промежуток времени корпорацией Miсrosoft было
разработано несколько версий Microsoft Foundation
Classes, которая становилась все мощнее и
удобнее. Есть все основания считать, что
развитие не остановится и на версии
4.1. К тому же поддержка другими
компаниями в рамках своих
компиляторов и средств
разработки
программного
обеспечения именно
Microsoft Foundation
Classes, а не OWL фирмы
Borland позволяет сконцентрироваться
на Microsoft Foundation Classes"​
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
SyDr
очень просто, как у меня в первом посте нарисовано.

Если $line < 300 символов, то сразу укладывать в пирамидку (уменьшать):

Надо сказать, что поставленная задача была решена очень профессионально.
Созданная библиотека предоставляет окна, блоки диалого, контексты
устройств, общие обьекты GDI, такие как битовые образы
и кисти, элементы управления.​

Если 600 > $line > 300, то сначала идет рост длины, а потом уменьшение (получается ромб):

Надо сказать, что поставленная задача была решена
очень профессионально.Созданная библиотека предоставляет окна,
блоки диалого, контексты устройств, общие обьекты GDI, такие как битовые образы
и кисти, элементы управления и многие другие стандартные элементы Windows. Основа.
программирования для Windows – обработка событий – представлена программистам
удобном и привычном виде. Классы библиотеки полностью вобрали в себя
многочисленные операторы switch, которые так загромождают
программы, написанные на С.​


Если $line > 600, то сначала идет рост, потом несколько строк на максимальную ширину (70), а потом, когда останется "хвост" в 300 символов, то начать уменьшать.


Надо сказать, что поставленная задача была решена
очень профессионально. Созданная библиотека предоставляет окна,
блоки диалого, контексты устройств, общие обьекты GDI, такие как битовые образы
и кисти, элементы управления и многие другие стандартные элементы Windows. Основа.
программирования для Windows – обработка событий – представлена программистам в
удобном и привычном виде. Классы библиотеки полностью вобрали в себя многочисленные
операторы switch, которые так загромождают программы, написанные на С. Наряду с
этим, совершенно свободно использовать как вызовы библиотеки классов, так и прямые
вызовы Win32 API. Кроме того, за сравнительно небольшой промежуток времени
корпорацией Miсrosoft было разработано несколько версий Microsoft Foundation
Classes, которая становилась все мощнее и удобнее. Есть все основания считать,
что развитие не остановится и на версии 4.1. К тому же поддержка другими
компаниями в рамках своих компиляторов и средств разработки
программного обеспечения именно Microsoft Foundation
Classes, а не OWL фирмы Borland позволяет
сконцентрироваться на Microsoft
Foundation Classes"
 
Верх