.NET Định dạng một chuỗi có khoảng trắng cố định


199

Phương thức .NET String.Format có cho phép đặt chuỗi ở vị trí cố định trong chuỗi có độ dài cố định không.

"Chuỗi đi ở đây"
"Chuỗi đi ở đây"
"Chuỗi đi ở đây"

Làm thế nào điều này được thực hiện bằng .NET?

Chỉnh sửa - Tôi đã thử Format / PadLeft / PadRight cho đến chết. Họ không làm việc. Tôi không biết tại sao. Tôi đã kết thúc việc viết chức năng của riêng tôi để làm điều này.

Chỉnh sửa - Tôi đã mắc lỗi và sử dụng dấu hai chấm thay vì dấu phẩy trong trình xác định định dạng. Nên là "{0,20}".

Cảm ơn tất cả các câu trả lời xuất sắc và chính xác.


48
Tôi chưa bao giờ có một chuỗi định dạng câu hỏi mà tôi không thể trả lời bằng cách vào trang này: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum: Tôi rất muốn bình chọn câu trả lời của bạn nhưng không thể bình luận
Dinah

PadLeft làm việc cho tôi kiểm tra xem bạn có rời khỏi không gian trong PadLeft không (20, 'TẠI ĐÂY ĐI KHÔNG GIAN')
Jedi Master Spooky

Có nghĩa là gì khi "để lại không gian trong". Nếu bạn có nghĩa là - tôi đang "cắt xén" chuỗi thì không. Nó vẫn không hoạt động.
dùng72491

Câu trả lời:


473

Điều này sẽ cung cấp cho bạn chính xác các chuỗi mà bạn yêu cầu:

string s = "String goes here";
string lineAlignedRight  = String.Format("{0,27}", s);
string lineAlignedCenter = String.Format("{0,-27}",
    String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string lineAlignedLeft   = String.Format("{0,-27}", s);

64
Điều này nên được đánh dấu là câu trả lời chính xác cho câu hỏi, nhưng có vẻ như OP đã để lại stackoverflow.
Oliver

9
Nếu bạn tìm kiếm séc xanh so với số phiếu tăng cao nhất, bạn không biết cách SO;)
Dave Jellison

2
@DaveJellison Có vẻ như ai đó cần phải viết một plugin để khắc phục điều đó, hoặc SO chỉ nên biến nó thành một sở thích người dùng có thể định cấu hình.
Walter Stabosz

1
@WalterStabosz không thể đồng ý nhiều hơn.
Dave Jellison

2
Tại sao điều này được thực hiện với ,thay vì :thích trong tất cả các định dạng khác?
LuckyLikey

65

Đầu tiên và cuối cùng, ít nhất, có thể sử dụng cú pháp sau:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

49

Kể từ Visual Studio 2015, bạn cũng có thể thực hiện điều này với Chuỗi nội suy (đây là một thủ thuật biên dịch, do đó, không quan trọng phiên bản nào của khung .net mà bạn nhắm mục tiêu).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";

9
tính năng số 6 của nó.
LuckyLikey

Tôi đã sử dụng C # 6 trong nhiều năm và không biết điều đó! Được nâng cấp :)
Avrohom Yisroel

17

Bạn đã được hiển thị PadLeftPadRight. Điều này sẽ điền vào chỗ còn thiếu PadCenter.

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

Lưu ý đến bản thân: đừng quên cập nhật CV của chính mình: "Một ngày, tôi thậm chí đã sửa mã của Joel Coehoorn!" ; -D -Serge


Joel, đoạn trích hay - Tôi đang cố gắng sử dụng nó và nó không hoàn toàn trung tâm, đúng như vậy. Có vẻ như dòng trả về phải giống như (Tôi không có đủ đại diện để chỉnh sửa ...): return s.PadLeft ((padding / 2) + s.Lipse, c) .PadRight (width, c);
shaunmartin

11

thử cái này:

"String goes here".PadLeft(20,' ');
"String goes here".PadRight(20,' ');

cho trung tâm lấy chiều dài của chuỗi và thực hiện padleft và padright với các ký tự cần thiết

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');

Có vẻ như các lệnh gọi String.Format () là không cần thiết.
Joel Coehoorn

Các phương thức pad là tốt vì các tùy chọn Định dạng yêu cầu độ dài là hằng số (nghĩa là String.Format("{0,-length}", something)sẽ không được biên dịch.
Roberto

6

Cảm ơn đã thảo luận, phương pháp này cũng hoạt động (VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  1. StringCentering () nhận hai giá trị đầu vào và nó trả về một chuỗi được định dạng.
  2. Khi độ dài của s lớn hơn hoặc bằng deisredLpm , hàm sẽ trả về chuỗi gốc.
  3. Khi chiều dài của s nhỏ hơn chiều dài mong muốn , nó sẽ được đệm cả hai đầu.
  4. Do khoảng cách ký tự là số nguyên và không có nửa không gian, chúng ta có thể có sự phân chia không gian không đồng đều. Trong thực hiện này, sự phân chia lớn hơn đi đến kết thúc hàng đầu.
  5. Hàm này yêu cầu .NET Framework do PadLeft ()PadRight () .
  6. Trong dòng cuối cùng của hàm, ràng buộc được từ trái sang phải, vì vậy firstpad đang được áp dụng tiếp theo là desiredLength pad.

Đây là phiên bản C #:

public string StringCentering(string s, int desiredLength)
{
    if (s.Length >= desiredLength) return s;
    int firstpad = (s.Length + desiredLength) / 2;
    return s.PadLeft(firstpad).PadRight(desiredLength);
}

Để hỗ trợ sự hiểu biết, Firstpad biến số nguyên được sử dụng. s.PadLeft (Firstpad) áp dụng (số lượng chính xác) khoảng trắng hàng đầu. PadRight bên phải nhất (chiều dài mong muốn) có kết thúc ràng buộc thấp hơn bằng cách áp dụng các khoảng trắng ở cuối.


1
Chào mừng đến với SO, chi. Đây là một ví dụ khác về bài đăng và câu trả lời TUYỆT VỜI đầu tiên. +1
Brian

Cảm ơn Brian, câu hỏi ban đầu ở đầu bài này là một điểm khởi đầu tuyệt vời. Tôi lấy cảm hứng từ tất cả các bài viết và câu trả lời trước của tôi.
chi

1

Đây là phiên bản VB.NET do tôi tạo, lấy cảm hứng từ câu trả lời của Joel Coehoorn, bản chỉnh sửa của Oliver và bình luận của shaunmartin:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

Điều này được thiết lập dưới dạng một chuỗi mở rộng, bên trong Mô-đun công cộng (cách bạn thực hiện Tiện ích mở rộng trong VB.NET, khác một chút so với C #). Một thay đổi nhỏ của tôi là nó coi một chuỗi rỗng là một chuỗi rỗng và nó đệm một chuỗi trống có giá trị độ rộng (đáp ứng nhu cầu cụ thể của tôi). Hy vọng rằng điều này sẽ dễ dàng chuyển đổi sang C # cho bất cứ ai cần nó. Nếu có cách nào tốt hơn để tham khảo các câu trả lời, chỉnh sửa và nhận xét tôi đã đề cập ở trên, điều này đã truyền cảm hứng cho bài đăng của tôi, xin vui lòng cho tôi biết và tôi sẽ làm điều đó - Tôi tương đối mới để đăng bài và tôi không thể tìm ra để lại một bình luận (có thể chưa có đủ đại diện).


0

Tôi đã đăng một bài viết CodeProject có thể là những gì bạn muốn.

Xem: AC # cách để định dạng chiều rộng và kiểu gián tiếp.

Về cơ bản, nó là một phương thức, FormatEx, hoạt động như String.Format, ngoại trừ nó cho phép một công cụ sửa đổi căn chỉnh trung tâm.

FormatEx("{0,c10}", value);

Có nghĩa là tập trung vào giá trị của varArss [0] trong trường rộng 10 ký tự, nghiêng sang phải nếu cần thêm không gian đệm.

FormatEx("{0,c-10}", value);

Có nghĩa là tập trung vào giá trị của varArss [0] trong trường rộng 10 ký tự, nghiêng sang trái nếu cần thêm không gian đệm.

Chỉnh sửa: Trong nội bộ, đây là sự kết hợp của Joel's PadCenter với một số phân tích cú pháp để cơ cấu lại định dạng và varArss cho một cuộc gọi đến String.Format thực hiện những gì bạn muốn.

-Jlie


-1

có vẻ như bạn muốn một cái gì đó như thế này, nó sẽ đặt chuỗi của bạn tại một điểm cố định trong một chuỗi có độ dài không đổi:

Dim totallength As Integer = 100
Dim leftbuffer as Integer = 5
Dim mystring As String = "string goes here"
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-")

lưu ý rằng điều này sẽ có vấn đề nếu mystring.length + leftbuffer vượt quá Totallength


-7
/// <summary>
/// Returns a string With count chars Left or Right value
/// </summary>
/// <param name="val"></param>
/// <param name="count"></param>
/// <param name="space"></param>
/// <param name="right"></param>
/// <returns></returns>
 public static string Formating(object val, int count, char space = ' ', bool right = false)
{
    var value = val.ToString();
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value;
    return value;
}

3
Đừng sử dụng mã này - nó tạo ra rất nhiều phân bổ chuỗi không cần thiết. Thay vào đó, sử dụng các chỉ định định dạng dựng sẵn và các phương thức đệm.
Oskar Berggren

1
thánh .. hãy tưởng tượng bằng cách sử dụng điều này trong một vòng lặp :)
LuckyLikey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.