Разделение строки на основе заданной длины символов - PullRequest
0 голосов
/ 02 ноября 2011

MVC 3. Vb.net.Часть моего приложения генерирует PDF-файлы, используя Itextsharp.Некоторые строки слишком длинные, чтобы правильно перейти на фоновое изображение.Поэтому мне нужно разделить эту строку, если ее длина превышает 26 символов, а когда она разбивается, она не может быть разбита на середину слова.оттуда я буду использовать новую строку, чтобы добавить строку справа к следующей строке ... Любые идеи, которые могут указать мне правильное направление ... Я начал строить функцию, которая будет передавать строку в тест на длину, а затемвернуть строку после ее окончания, но я оступился после этого ..

    Private Function stringLength(ByVal _string As String) As String
        If _string.Length < 26 Then
            _string.Split(
        End If
    End Function

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Я уверен, что есть миллион различных способов сделать это.

Вам в основном нужно разбить все ваши слова по пробелам в списке.После этого вам просто нужно продолжать проверять, достигает ли текущее слово плюс пробел плюс следующее слово вашего порога или нет, и если это так, вы переходите на следующую строку.Когда у вас есть все строки, вы снова объединяетесь в одну строку.

Private Function LimitWidth(ByVal text As String, ByVal maxCharacters As Integer) As String
  Dim words As List(Of String) = text.Split(" "c).ToList()

  If text.Length < maxCharacters OrElse words.Count = 1 Then
    Return text
  Else
    Dim lines As New List(Of String)

    Dim currentLine As String = words(0)
    For i As Integer = 1 To words.Count - 1
      If (currentLine & " " & words(i)).Length > maxCharacters Then
        lines.Add(currentLine)
        currentLine = words(i)

        If i = words.Count - 1 Then
          lines.Add(currentLine)
        End If
      Else
        If i = words.Count - 1 Then
          lines.Add(currentLine & " " & words(i))
        End If

        currentLine &= " " & words(i)
      End If
    Next

    Return String.Join(Environment.NewLine, lines.ToArray())
  End If
End Function

Для проверки:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  MessageBox.Show(LimitWidth("This is a really long sentence " & _
                             "meant to demonstrate how to split " & _
                             "the words into a confined character length.", 26))
End Sub
1 голос
/ 02 ноября 2011

Звучит так, будто вы просите функцию переноса слов.

Поскольку я чувствую, что лучше отвечать способом, способствующим обучению, чем просто давать ответы, у меня есть для вас ссылка, которая проведет вас через процесс использования Test Driven Development (TDD) для решения этой проблемы. Так уж сложилось, что проблема переноса слов - это популярное кодирующее ката, и Роберт С. Мартин написал несколько глупых вымышленных рассказов о том, как разработчик учится использовать TDD для решения слово-переноса ката.

Примеры кода на Java, но читать и переводить их должно быть тривиально.

http://thecleancoder.blogspot.com/2010/10/craftsman-62-dark-path.html

Гуфи биты можно пропустить. Просто перейдите к предложениям прямо перед первым фрагментом кода.

0 голосов
/ 30 июня 2019

Я бы добавил к нему обработку многострочного ввода текста со следующим:

Private Function LimitWidth(ByVal text As String, ByVal maxCharacters As Integer, SplitSign As String) As String
    Dim Output As String = ""
    Dim OrgLines As List(Of String) = text.Split(Environment.NewLine).ToList()
    For x As Integer = 1 To OrgLines.Count - 1
        Dim words As List(Of String) = OrgLines(x).Split(" "c).ToList()
        If text.Length < maxCharacters OrElse words.Count = 1 Then
            Output += OrgLines(x)
        Else
            Dim lines As New List(Of String)

            Dim currentLine As String = words(0)
            For i As Integer = 1 To words.Count - 1
                If (currentLine & " " & words(i)).Length > maxCharacters Then
                    lines.Add(currentLine)
                    currentLine = words(i)

                    If i = words.Count - 1 Then
                        lines.Add(currentLine)
                    End If
                Else
                    If i = words.Count - 1 Then
                        lines.Add(currentLine & " " & words(i))
                    End If

                    currentLine &= " " & words(i)
                End If
            Next
            Output += String.Join(SplitSign, lines.ToArray())
        End If
    Next
    Return Output
End Function

использование:

LimitWidth ("ваш текст", 80, Environment.NewLine)

...