Câu hỏi String.Format - cách nó hoạt động và cách triển khai các định dạng tùy chỉnh


Với String.Format() có thể định dạng ví dụ DateTime đối tượng theo nhiều cách khác nhau. Mỗi khi tôi đang tìm kiếm một định dạng mong muốn, tôi cần tìm kiếm trên Internet. Hầu như luôn luôn tôi tìm thấy một ví dụ tôi có thể sử dụng. Ví dụ:

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

Nhưng tôi không có bất kỳ đầu mối nào hoạt động và lớp nào hỗ trợ các chuỗi bổ sung 'ma thuật' này.

Vì vậy, câu hỏi của tôi là:

  1. Làm thế nào String.Format ánh xạ thông tin bổ sung MM/dd/yyyy cho một kết quả chuỗi?
  2. Tất cả các đối tượng của Microsoft có hỗ trợ tính năng này không?
    Đây có phải là tài liệu ở đâu đó không?
  3. Có thể làm một cái gì đó như thế này:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

76
2018-05-09 08:20


gốc


Bạn có thể xem cái này codeproject.com/Articles/6533/Custom-String-Formatting-in-NET - V4Vendetta


Các câu trả lời:


String.Format khớp với từng mã thông báo bên trong chuỗi ({0} vv) đối với đối tượng tương ứng: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Chuỗi định dạng được cung cấp tùy chọn:

{ index[,alignment][ : formatString] }

Nếu formatString được cung cấp, đối tượng tương ứng phải triển khai IFormattable và cụ thể là ToString phương thức chấp nhận formatString và trả về chuỗi được định dạng tương ứng: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

An IFormatProvider cũng có thể được sử dụng có thể được sử dụng để nắm bắt các tiêu chuẩn / mặc định định dạng cơ bản, v.v. đây và đây.

Vì vậy, câu trả lời cho câu hỏi của bạn theo thứ tự:

  1. Nó sử dụng IFormattable giao diện ToString() phương pháp trên DateTime đối tượng và truyền rằng MM/dd/yyyy chuỗi định dạng. Đó là thực hiện mà trả về chuỗi chính xác.

  2. Bất kỳ đối tượng nào triển khai IFormattable hỗ trợ tính năng này. Bạn thậm chí có thể viết của riêng bạn!

  3. Có, xem ở trên.


81
2018-05-09 08:27



+1 để liên kết tới tài liệu. "Tìm kiếm trên internet" có thể được chấp nhận. Nhưng khi bạn cần hiểu biết sâu hơn, bạn nên đọc Hướng dẫn. - MarkJ
Câu trả lời hay nhưng bạn có thể cho tôi biết tôi có thể tìm thấy ở đâu cho mỗi lớp thực hiện IFormattable, nơi tôi có thể tìm thấy chuỗi định dạng được phép. Ví dụ hỗ trợ DateTime (trên đầu của tôi) y M d h m s và hơn thế nữa. Hỗ trợ các loại Nummeric C từ tiền tệ nhưng đó không phải tất cả tôi biết từ việc tìm kiếm arround và không phải bằng cách xem tài liệu của Microsoft. - hwcverwe
@hwcverwe - gần như mọi tìm kiếm của Google sẽ đặt tài liệu MSDN ở hoặc gần đầu tìm kiếm cho bất kỳ tìm kiếm đối tượng nào.ToString. Sẽ không có trang đơn nào hiển thị ToString (...) cho mọi đối tượng - có khả năng một số lượng "vô hạn" của chúng, bởi vì mặc định tất cả các đối tượng thực hiện ít nhất ToString (), mặc dù không nhất thiết ToString (định dạng). - Wonko the Sane
@hwcverwe Loại định dạng - Vladimir


Từ sự hiểu biết của tôi, bạn sẽ cần phải thực hiện IFormattable trong lớp học của bạn để hỗ trợ điều này. Điều đó sau đó có phương pháp, ToString mà có các tham số bạn vượt qua vào String.Format.

Đây là một ví dụ.

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())

16
2018-05-09 08:26





  1. Kiểm tra các tài liệu MSDN chính thức, có một danh sách đầy đủ các chuỗi định dạng DateTime tại đây: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx. Có thực sự khá một vài "huyền diệu" dây.

  2. Theo như tôi biết không phải tất cả các loại có định dạng "thú vị", nhưng tất cả các loại hỗ trợ ToString(). Nếu bạn cần định dạng một đối tượng tích hợp, bạn có thể thêm một phương thức mở rộng để làm điều đó, nhưng thông thường định dạng được cung cấp ở bất kỳ nơi nào cần thiết (hoặc để đặt nó theo cách khác, tôi chỉ viết các trình định dạng tùy chỉnh cho các kiểu của riêng tôi).

  3. Có, bạn có thể viết của riêng bạn và nếu bạn có dữ liệu có thể được định dạng theo những cách khác nhau, bạn có thể nên viết trình định dạng tùy chỉnh bằng cách triển khai IFormattable, lại thấy tài liệu ở đây: http://msdn.microsoft.com/en-us/library/system.iformattable.aspx. Nó khá đơn giản, bạn chỉ cần kiểm tra các chuỗi được cung cấp và ghi dữ liệu của bạn dựa trên những điều này, không có phép thuật đằng sau hậu trường :-)


4
2018-05-09 08:28





Dưới trang bìa String.Format thực hiện điều gì đó như sau,

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

Đối với câu hỏi của bạn,

  1. String.Format ánh xạ thông tin bổ sung MM / dd / yyyy đến một kết quả chuỗi như thế nào?

    Như được chỉ định ở trên, nó chỉ gọi IFormattable. ToString (định dạng chuỗi, nhà cung cấp IFormatProvider). Các nhà cung cấp thường là một cái gì đó mà nói với bạn những gì văn hóa là của hệ thống của bạn. Thường là null vì mọi người không vượt qua nó String.Format () như bạn đã làm trong trường hợp của bạn.

  2. Tất cả các đối tượng microsoft có hỗ trợ tính năng này không? Đây có phải là tài liệu ở đâu đó không?

    Bất cứ điều gì thực hiện IFormattable nào.

  3. Có thể làm một cái gì đó như thế này: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    Về cơ bản nếu bạn muốn đối tượng của riêng bạn làm điều gì đó với định dạng được cung cấp, bạn thực hiện IFormattable.

Có một số lượng lớn các lớp hỗ trợ và điều tra viên để đảm bảo rằng các chuỗi định dạng là phần lớn giống. Xem thêm tại đây.


3
2018-05-09 08:32





Có, có thể - nó có thể được tùy chỉnh hoàn toàn. Nhìn vào điều này liên kết tài liệu về định dạng tùy chỉnh ngày và giờ.

Nếu bạn có đối tượng của riêng bạn, bạn có thể ghi đè lên ToString() phương pháp và đầu ra bất cứ điều gì bạn nghĩ là đại diện thích hợp. Một khi bạn làm điều này bạn có thể sử dụng String.Format("{0:MyCustomFormat}", new MyOwnClass()) bởi vì điều này ngầm gọi MyOwnClass.ToString()


0
2018-05-09 08:24



-1 - OP hỏi nhiều hơn DateTime định dạng. Và chỉ một liên kết không phải là một câu trả lời. - Oded
Rất khắc nghiệt. DateTime là một trong những khía cạnh và tôi đã mở rộng câu trả lời của tôi trong khi bạn downvoted. - Maciej D.
Mở rộng câu trả lời sau đó đăngvà bạn sẽ không bị giảm giá. - Oded
Đã xóa ghi chú khi bạn thêm một số thông tin. - Oded


Tài liệu cho các ngày có thể được tìm thấy ở đây: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Điều đó sẽ cho bạn biết chính xác những gì tất cả các ngày định dạng ký tự như MM có nghĩa là.

Nếu bạn muốn thay đổi cách chuỗi là đầu ra cho một lớp tùy chỉnh, bạn có thể ghi đè lên phương thức ToString, như sau:

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

và sau đó bạn có thể làm một cái gì đó như myUser.ToString() và nhận được kết quả bạn đã chỉ định.


0
2018-05-09 08:26





Và để trả lời câu hỏi thứ ba của bạn: Điều đó là không thể với cú pháp này, nhưng bạn có thể cung cấp các trường hợp IFormatProvider và ICustomFormatter cho loại bạn không tạo hoặc triển khai IFormattable bên trong loại của bạn (mặc dù, về cơ bản mở rộng ToString).


0
2018-05-09 08:29