Что нового

Еще одна задачка на строки - разбить длинную строку красивой пирамидкой

Suppir

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

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

Необходимо преобразовать ее к виду:

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
А где, если не секрет, ты собираешься использовать это? Я ведь в прошлом посте написал, что это будет работать только для моноширинных шрифтов.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ну, любой может использовать в MsgBox или Label вместе со шрифтами Courier New или Courier.
А я буду использовать для формирования заголовков документов.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
$line = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
MsgBox(0,'',$line)
MsgBox(0, '', Pyra($line, 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 $sRet
EndFunc
 
Автор
S

Suppir

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

А можно сделать так, чтобы в начало каждой строки было добавлено необходимое количество пробелов.
Т.е. если строчка длиной 70 (максимальная длина), то добавлять пробелов не нужно.
Если строчка 50, то добавить 10 пробелов (тогда текст будет ровно посередине строки расположен: 10 + 50 + 10 = 70)
Если строчка длиной 30, то добавать 20 пробелов (20 + 30 + 20 = 70)


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

Т.е. отступы слева должны быть в виде пробелов.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
$line = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
MsgBox(0,'',$line)
MsgBox(0, '', Pyra($line, 70))

Func Pyra($sLine, $iMaxLen)
	Local $iMaxLenSave = $iMaxLen
	Local $aSplittedLine = StringSplit($sLine, ' ')
	Local $sRet, $sNewLine
	Local $iLen, $iDiff
	For $i = 1 To $aSplittedLine[0] Step +1
		If StringLen($sNewLine & ' ' & $aSplittedLine[$i]) <= $iMaxLen Then
			$sNewLine &= ' ' & $aSplittedLine[$i]
		Else
			$iLen = StringLen($sNewLine)
			$iDiff = $iMaxLenSave - $iLen
			$iDiff = Int($iDiff /2)
			If $iDiff >= 1 Then
				For $i2 = 1 To $iDiff Step +1
					$sNewLine = ' ' & $sNewLine
				Next
			EndIf
			$sRet &= $sNewLine & @CRLF
			$iMaxLen = $iLen -1
			$sNewLine = $aSplittedLine[$i]
		EndIf
	Next
	$iDiff = $iMaxLenSave - StringLen($sNewLine)
	$iDiff = Int($iDiff /2)
	If $iDiff >= 1 Then
		For $i2 = 1 To $iDiff Step +1
			$sNewLine = ' ' & $sNewLine
		Next
	EndIf
	$sRet &= $sNewLine
	Return $sRet
EndFunc
 
Автор
S

Suppir

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


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

Почему-то в первой строке добавляется лишний пробел в начало сроки?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
$line = 'Информация региональной энергетической комиссии - департамента цен и тарифов Краснодаского края “Прогноз цен РЭК-департамента цен и тарифов Краснодарского края на автомобильное топливо на период 3 квартала 2010 года'
MsgBox(0,'',$line)
MsgBox(0, '', Pyra($line, 70))

Func Pyra($sLine, $iMaxLen)
    Local $iMaxLenSave = $iMaxLen
    Local $aSplittedLine = StringSplit($sLine, ' ')
    Local $sRet, $sNewLine
    Local $iLen, $iDiff
	$sNewLine = $aSplittedLine[1]
    For $i = 2 To $aSplittedLine[0] Step +1
        If StringLen($sNewLine & ' ' & $aSplittedLine[$i]) <= $iMaxLen Then
            $sNewLine &= ' ' & $aSplittedLine[$i]
        Else
            $iLen = StringLen($sNewLine)
            $iDiff = $iMaxLenSave - $iLen
            $iDiff = Int($iDiff /2)
            If $iDiff >= 1 Then
                For $i2 = 1 To $iDiff Step +1
                    $sNewLine = ' ' & $sNewLine
                Next
            EndIf
            $sRet &= $sNewLine & @CRLF
            $iMaxLen = $iLen -1
            $sNewLine = $aSplittedLine[$i]
        EndIf
    Next
    $iDiff = $iMaxLenSave - StringLen($sNewLine)
    $iDiff = Int($iDiff /2)
    If $iDiff >= 1 Then
        For $i2 = 1 To $iDiff Step +1
            $sNewLine = ' ' & $sNewLine
        Next
    EndIf
    $sRet &= $sNewLine
    Return $sRet
EndFunc
 
Верх