• 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#

Điều hành viên: tungblt, vuathongtin

muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 526
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 185 time
Been thanked: 32 time
Liên hệ:

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

Gửi bàigửi bởi muaphonui_2010 » CN 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.
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.



muaphonui_2010
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 526
Ngày tham gia: T.Sáu 26/11/2010 1:15 pm
Đến từ: TP.HCM
Has thanked: 185 time
Been thanked: 32 time
Liên hệ:

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

Gửi bàigửi bởi muaphonui_2010 » T.Hai 22/04/2019 8:27 am

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

Hình đại diện của người dùng
thuanfun
Thành viên tích cực
Thành viên tích cực
Bài viết: 140
Ngày tham gia: T.Năm 06/11/2008 7:46 pm
Been thanked: 10 time

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

Gửi bàigửi bởi thuanfun » CN 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

Hình đại diện của người dùng
xuanquy_th
Guru
Guru
Bài viết: 803
Ngày tham gia: T.Ba 05/08/2008 9:15 pm
Đến từ: Thanh Hoá
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

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

Gửi bàigửi bởi xuanquy_th » T.Bảy 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!!!


Quay về “Visual Basic .NET và C# (VB.NET & C#)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.15 khách