• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

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

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Moderators: tungblt, vuathongtin

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 531
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 186 times
Been thanked: 32 times
Contact:

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

Postby muaphonui_2010 » Sun 21/04/2019 6:38 pm

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.
Image

==> 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.



muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Posts: 531
Joined: Fri 26/11/2010 1:15 pm
Location: TP.HCM
Has thanked: 186 times
Been thanked: 32 times
Contact:

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

Postby muaphonui_2010 » Mon 22/04/2019 8:27 am

Hi.
Mình mò được rồi nha.
Xin cảm ơn.

Code: Select all

 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;
        }

User avatar
thuanfun
Thành viên tích cực
Thành viên tích cực
Posts: 141
Joined: Thu 06/11/2008 7:46 pm
Been thanked: 10 times

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

Postby thuanfun » Sun 28/04/2019 10:36 pm

Đâ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.  
Nhận code VB.NET theo yêu cầu

User avatar
xuanquy_th
Guru
Guru
Posts: 803
Joined: Tue 05/08/2008 9:15 pm
Location: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 times
Contact:

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

Postby xuanquy_th » Sat 20/07/2019 7:46 am

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.  
Khi Chúa Trời đóng cánh cửa này lại, Ngài sẽ mở một cánh cửa khác cho ta.
Nhưng ta thường nhìn quá lâu vào cánh cửa đã đóng nên không thấy được có một cánh cửa khác đang mở ra cho ta!!!


Return to “Visual Basic .NET và C# (VB.NET & C#)”

Who is online

Users browsing this forum: No registered users and 2 guests