2011-08-01 33 views
5

Tôi đang cố định dạng một chuỗi có độ dài tùy ý thành trường chiều rộng cố định để hiển thị.Làm cách nào để định dạng chuỗi thành trường chiều rộng cố định trong .Net?

Hãy sử dụng chiều rộng 20 làm ví dụ và gọi chuỗi được định dạng s. Tôi đang thêm chuỗi được định dạng vào một StringBuilder có tên b.

Dim b As New System.Text.StringBuilder() 
Dim s as New String 

Nếu chuỗi Tôi muốn hiển thị là ngắn hơn 20 ký tự, tôi có thể làm điều này:

b.Append(s.PadRight(20)) 

hoặc

b.AppendFormat("{0,-20}", s) 

Cho đến nay, như vậy tốt. Nhưng, nếu chuỗi dài hơn 20 ký tự, tôi muốn chuỗi bị cắt ngắn thành 20 ký tự khi được thêm vào. Đoạn mã trên gắn thêm toàn bộ chuỗi.

Tôi cố gắng này:

b.Append(s.Substring(0,20).PadRight(20)) 

Nhưng, điều này bắn một ngoại lệ nếu chuỗi là ngắn hơn 20 ký tự.

Vì vậy, tôi đã kết thúc với:

b.Append(s.PadRight(20).Substring(0,20)) 

Điều này dường như thực hiện công việc. PadRight ngăn chặn ngoại lệ bằng cách đảm bảo chuỗi ký tự có 20 ký tự trước khi chuỗi con được thực hiện.

Tôi đã tự hỏi nếu có một phương pháp thay thế sẽ trông thanh lịch hơn và tránh đệm chuỗi chỉ để ngăn chặn chuỗi con gây ra một ngoại lệ. Tôi đã bỏ lỡ một tính năng của String.Format có thể thực hiện điều này trong một bước?

Edited để thêm giải pháp:

tôi đã kết thúc với đoạn mã sau:

Module Extensions 
    <Extension()> _ 
    Function AppendFixed(ByVal b As StringBuilder, ByVal s As String, ByVal width As Integer) As StringBuilder 
     If s.Length >= width Then 
      b.Append(s, 0, width) 
     Else 
      b.Append(s) 
      b.Append(" ", width - s.Length) 
     End If 
     Return b 
    End Function 
End Module 

này sử dụng một phương pháp khuyến nông để làm sạch các cú pháp, theo đề nghị của Joel và Merlyn, và cách sử dụng StringBulider Nối các quá tải để tránh tạo các chuỗi mới sẽ phải thu gom rác, như được gợi ý bởi supercat. Nhờ những người đã giúp.

+0

Bạn đã kết thúc với chính xác mã tôi sử dụng để làm điều này khi cần thiết. Tôi nghĩ đó là cách đơn giản nhất để hoàn thành những gì bạn cần. – David

Trả lời

6

tôi đã tự hỏi nếu có một phương pháp thay thế mà sẽ trông thanh lịch hơn và tránh đệm chuỗi

(nhấn mạnh thêm)

<Extension()> _ 
Public Function AppendFixed(ByVal target As StringBuilder, ByVal value As String, ByVal desiredLength As Integer) As StringBuilder 
    If value.Length < desiredLength Then value.PadRight(desiredLength) 
    Return target.Append(value.Substring(0,desiredLength)) 
End Function 

Để sử dụng nó:

b.AppendFixed(s, 20) 
+0

Tôi đã không nghĩ đến việc sử dụng một phương pháp mở rộng. cảm ơn vì tiền hỗ trợ. –

+0

+1; Điều này trả lời câu hỏi với logic rất rõ ràng, vì vậy +1. Nhưng sẽ không 'PadRight' ngầm làm điều này kiểm tra (hoặc tương đương hợp lý) nội bộ? –

3

Tôi không nghĩ rằng có một cách thanh lịch hơn để thực hiện việc này.Mặc dù bạn có thể quấn chức năng này thành một phương pháp khuyến nông:

Imports System.Runtime.CompilerServices 

Module StringExtensions 

    <Extension()> _ 
    Public Function AsFixedWidth(ByVal value As String, desiredLength As Integer) As String 
     return value.PadRight(desiredLength).Substring(0,desiredLength) 
    End Function 

End Module 

Và sử dụng nó như thế này:

b.Append(s.AsFixedWidth(20)) 
+0

Hãy cho tôi biết nếu phỏng đoán dịch VB.Net của tôi không cắt mù tạt :) –

+0

Bạn quên một ByVal và sử dụng một chữ thường thấp hơn trong Return, nhưng nó vẫn nên biên dịch và chạy mặc dù cả hai. Lỗ hổng lớn là thiếu _ sau thuộc tính, nhưng tôi đã sửa lỗi đó cho bạn và nó chỉ yêu cầu _prior_ thành .Net 4. –

+0

Ồ, và tôi gần như bỏ lỡ hàm phụ vs. Bạn chỉ có thể trả về các giá trị từ các hàm. –

1

tôi sẽ đề nghị rằng để giảm thiểu căng thẳng cho các nhà sưu tập rác, ta nên xử lý riêng các trường hợp mà người ta cần phải trả về một chuỗi từ những nơi người ta cần phải nối thêm một chuỗi cho một StringBuilder. Một cũng nên tách ra các trường hợp chuỗi được nối vào ngắn hơn mức cần thiết, chính xác độ dài mong muốn hoặc dài hơn mức cần thiết.

Nếu một người cần trả lại một chuỗi có cùng độ dài với bản gốc, chỉ cần trả lại chuỗi gốc. Nếu chuỗi cần đệm, hãy đệm nó bằng một chuỗi mới ('', requestedLength-TheString.Length). Nếu nó cần phải được thực hiện ngắn hơn, trả về TheString.Substring (0, requestedLength).

Nếu cần thêm thứ gì đó vào StringBuilder và chuỗi gốc không còn cần thiết, hãy thêm chuỗi và sau đó sử dụng quá tải (char, int) của Append để thêm đệm nếu cần. Nếu chuỗi gốc quá dài, hãy sử dụng quá tải (String, int, int) của Append để chỉ thêm phần thích hợp.

+0

Cảm ơn, supercat, cho con trỏ tới quá tải (char, int) và (String, int, int). Tôi sẽ sử dụng chúng trong phương pháp mở rộng của mình. –

0

Chức năng MakeFixedLength (ByVal str As String, ByVal desiredLength As Integer, ByVal LR As String, ByVal chr Như Char) As String

If str.Length >= desiredLength Then 

     Return str.Substring(0, desiredLength) 

    Else 

     If LR = "L" Then 

      Return str.PadLeft(desiredLength, chr).Substring(0, desiredLength) 

     Else 

      Return str.PadRight(desiredLength, chr).Substring(0, desiredLength) 

     End If 

    End If 

End Function 
Các vấn đề liên quan