Trang 1 trên 1

Chèn ký tự vào chuổi trong C#

Đã gửi: CN 21/04/2019 6:38 pm
gửi bởi muaphonui_2010
Chào các bạn.
Mình muốn chằn ký tự "\n" vào chuổi với điều kiện như sau:
Giả sử mình có chuổi = "Câu lạc bộ VN.Net là nơi tôi yêu mến nhất trong tất cả các diễn đàn, nó gắn bó với tôi rất nhiều"
==> Mình muốn cứ 27 ký tự thì thay vào ký tự "\n", nhưng nếu ký tự thứ 27 đó không phải dấu cách thì thay vào ký tự "\n" cho dấu cách kế trước .

Với ví dụ trên thì nó sẽ chằn như sau:
==> Câu lạc bộ VN.Net là nơi\ntôi yêu mến nhất trong tất\ncả các diễn đàn, nó gắn bó\nvới tôi rất nhiều
Cách tính như hình dưới.
Hình ảnh

==> Mục đích của mình là nguốn ngắt chuổi để xuống dòng chứ nó dài quá.
Nhờ các bạn giúp mình với nhé.
Xin cảm ơn.

Re: Chèn ký tự vào chuổi trong C#

Đã gửi: T.Hai 22/04/2019 8:27 am
gửi bởi muaphonui_2010
Hi.
Mình mò được rồi nha.
Xin cảm ơn.

Mã: Chọn hết

 private string chenkytu(string chuoi)
        {
            int kytu27 = 27;
            for (int i = 1; i < chuoi.Length; i++)
            {
                if (i == kytu27)
                {
                    if (chuoi[i] == ' ')
                    {
                        chuoi = chuoi.Insert(i, "\n");
                    }
                    else
                    {
                        int solui = 0;
                        for (int n = i; n > 1; n--)
                        {
                            solui += 1;
                            if (chuoi[n] == ' ')
                            {
                                chuoi = chuoi.Insert(n, "\n");
                                i = n;
                                kytu27 += (26 -solui);
                                break;
                            }
                        }
                    }
                }
             
            }
            return chuoi;
        }

Re: Chèn ký tự vào chuổi trong C#

Đã gửi: CN 28/04/2019 10:36 pm
gửi bởi thuanfun
Đây là đoạn code VB.NET cho speed nhanh:

  1. Private Function _autoXuongDong(ByVal s As String, Optional ByVal maxLen As Integer = 27) As String
  2.         Dim pos As Integer = 0, p As Integer, insertPos As New List(Of Integer)
  3.         Do Until 1 = 0
  4.             p = _getNextPos(s, pos, maxLen)
  5.             If p < 0 Then Exit Do
  6.             insertPos.Add(p) : pos = p
  7.         Loop
  8.         For i = insertPos.Count - 1 To 0 Step -1
  9.             s = s.Insert(insertPos(i), "\n")
  10.         Next
  11.         Return s
  12.     End Function
  13.     Private Function _getNextPos(ByVal s As String, ByVal pos As Integer, Optional ByVal maxLen As Integer = 27) As Integer
  14.         Dim p = pos + maxLen
  15.         If p >= s.Length Then Return -1
  16.         If s(p) = " " Then Return p
  17.         For i = p To pos Step -1
  18.             If s(i) = " " Then Return i
  19.         Next
  20.         Return p
  21.     End Function
  22.  

Re: Chèn ký tự vào chuổi trong C#

Đã gửi: T.Bảy 20/07/2019 7:46 am
gửi bởi xuanquy_th
Xuống dòng mà dựa vào số ký tự thì mình thấy không hợp lý
Đơn cử như chuổi ký tự
"WWWWWWWWWW" Khác hoàn toàn với "IIIIIIIIII"
Nên xuống dòng theo độ dộng của chuổi thì hợp lý hơn VD
  1.     Dim s() As String = GetLineText("Câu lạc bộ VN.Net là nơi tôi yêu mến nhất trong tất cả các diễn đàn, nó gắn bó với tôi rất nhiều", New Font("Microsoft Sans Serif", 8, FontStyle.Regular), 130, 0)
  2.  
  3.     ''' <summary>
  4.     ''' Cắt lấy chuổi thể hiện theo độ rộng xác định
  5.     ''' </summary>
  6.     ''' <param name="s">Chuổi cần cắt</param>
  7.     ''' <param name="f">Phông sử dụng tính độ rộng thẻ hiện</param>
  8.     ''' <param name="wn">Độ rộng thể hiện xác định chung cho các dòng</param>
  9.     ''' <param name="w1">Độ rộng giãm trừ cho dòng đầu tiên khi cắt</param>
  10.     ''' <value>Kết quả cắt được trả ra</value>
  11.     ''' <returns></returns>
  12.     ''' <remarks></remarks>
  13.     Public ReadOnly Property GetLineText(ByVal s As String, ByVal f As Font, ByVal wn As Single, ByVal w1 As Single) As String()
  14.         Get
  15.             Dim s2(-1) As String, mS() As String = s.Replace(vbNewLine, ChrW(10)).Replace(ChrW(13), ChrW(10)).Split(ChrW(10))
  16.             For i1 As Integer = 0 To UBound(mS)
  17.                 ReDim Preserve s2(s2.Length) : s = mS(i1)
  18.                 s2(UBound(s2)) = Me.GetLineText(s, f, (wn - w1))
  19.                 If (s2(UBound(s2)).Length = 0) AndAlso (s.Length > 0) Then
  20.                     s2(UBound(s2)) = s.Substring(0, 1)
  21.                     For i2 As Integer = 1 To (s.Length - 1)
  22.                         ReDim Preserve s2(s2.Length) : s2(UBound(s2)) = s.Substring(i2, 1)
  23.                     Next i2
  24.                     Continue For
  25.                 End If
  26.                 s = s.Substring(s2(UBound(s2)).Length)
  27.                 Do While (s.Length > 0)
  28.                     ReDim Preserve s2(s2.Length)
  29.                     s2(UBound(s2)) = Me.GetLineText(s, f, wn)
  30.                     s = s.Substring(s2(UBound(s2)).Length)
  31.                 Loop
  32.             Next i1
  33.             Return s2
  34.         End Get
  35.     End Property
  36.     ''' <summary>
  37.     ''' Cắt lấy chuổi thể hiện theo độ rộng xác định
  38.     ''' </summary>
  39.     ''' <param name="s">Chuổi cần cắt</param>
  40.     ''' <param name="f">Phông sử dụng tính độ rộng thẻ hiện</param>
  41.     ''' <param name="w">Độ rộng thể hiện xác định</param>
  42.     ''' <value>Kết quả cắt được trả ra</value>
  43.     ''' <returns></returns>
  44.     ''' <remarks></remarks>
  45.     Public ReadOnly Property GetLineText(ByVal s As String, ByVal f As Font, ByVal w As Single) As String
  46.         Get
  47.             If (s.Length = 0) Then Return s
  48.             If (s.Length > 1000) Then s = s.Substring(0, 1000)
  49.             Dim strFM As New StringFormat(), CharRange(0) As CharacterRange, reg() As Region
  50.             Dim measureRect As New RectangleF(0.0F, 0.0F, 300.0F, 100.0F), mInd As Integer = 0
  51.             CharRange(0) = New CharacterRange(0, s.Length)
  52.             strFM.SetMeasurableCharacterRanges(CharRange)
  53.             reg = g1.MeasureCharacterRanges(s, f, measureRect, strFM)
  54.             measureRect = reg(0).GetBounds(g1)
  55.             Do While (measureRect.Width > w)
  56.                 If s.Contains(" ") AndAlso (s.Substring(0, 1) = " ") AndAlso s.TrimStart.Contains(" ") Then
  57.                     mInd = (s.Length - s.TrimStart.Length)
  58.                     s = Space(mInd) & s.TrimStart.Substring(0, InStrRev(s.TrimStart, " ") - 1)
  59.                 ElseIf s.TrimStart.Contains(" ") Then
  60.                     s = s.Substring(0, InStrRev(s, " ") - 1)
  61.                 Else
  62.                     s = s.Substring(0, s.Length - 1)
  63.                 End If
  64.                 If (s.Length = 0) Then Return s
  65.                 CharRange(0) = New CharacterRange(0, s.Length)
  66.                 strFM.SetMeasurableCharacterRanges(CharRange)
  67.                 measureRect = New RectangleF(0.0F, 0.0F, 300.0F, 100.0F)
  68.                 reg = g1.MeasureCharacterRanges(s, f, measureRect, strFM)
  69.                 measureRect = reg(0).GetBounds(g1)
  70.             Loop
  71.             Return s
  72.         End Get
  73.     End Property
  74.