2012-05-09 25 views
76

Với String.Format(), bạn có thể định dạng ví dụ DateTime các đố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 - cách hoạt động và cách triển khai các định dạng tùy chỉnh

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. như thế nào String.Format map thêm thông tin MM/dd/yyyy đến 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?
    Tài liệu này có ở đâu đó không?
  3. Có thể làm một cái gì đó như thế này:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())
+0

Bạn có thể xem tại http://www.codeproject.com/Articles/6533/Custom-String-Formatting-in-NET – V4Vendetta

Trả lời

79

String.Format trận đấu mỗi thẻ bên trong chuỗi ({0} vv) chống lại các đối tượng tương ứng: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Một chuỗi định dạng là tùy chọn được cung cấp:

{ index[,alignment][ : formatString] }

Nếu formatString được cung cấp, tương ứng đối tượng phải triển khai IFormattable và cụ thể phương thức ToString 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 định dạng cơ bản/mặc định, v.v. Ví dụ herehere.

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 phương pháp giao diện IFormattable của ToString() trên đối tượng DateTime và truyền rằng chuỗi định dạng MM/dd/yyyy. Đó 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 đều 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.

+9

+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

+0

Câu trả lời hay nhưng bạn có thể cho tôi biết nơi tôi có thể tìm thấy cho mỗi lớp thực hiện 'IFormattable', nơi tôi có thể tìm thấy định dạng được cho phép hay không. Ví dụ hỗ trợ DateTime (trên đầu của tôi) 'y M d h m s' và hơn thế nữa. Các loại Nummeric hỗ trợ 'C' từ tiền tệ nhưng đó không phải là tất cả những gì 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

+0

@hwcverwe - gần như mọi tìm kiếm của Google đều sẽ đặt tài liệu MSDN ở hoặc gần đầu tìm kiếm cho bất kỳ đối tượng tìm kiếm 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). –

0

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

Nếu bạn có đối tượng của riêng mình, bạn có thể ghi đè phương thức và phương thức ToString() bất cứ điều gì bạn cho là đại diện phù hợp. Khi bạn thực hiện việc này, bạn có thể sử dụng String.Format("{0:MyCustomFormat}", new MyOwnClass()) vì điều này hoàn toàn gọi đến số MyOwnClass.ToString()

+0

-1 - OP này hỏi về định dạng 'DateTime' hơn. Và chỉ một liên kết không phải là một câu trả lời. – Oded

+1

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

+6

Mở rộng câu trả lời _then post_ và bạn sẽ không bị giảm giá. – Oded

16

Từ hiểu biết của tôi, bạn sẽ cần phải triển khai 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()) 
0

Các tài liệu cho những 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 ký tự định dạng ngày tháng như MM có ý nghĩa.

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

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 chỉ có thể làm một cái gì đó giống như myUser.ToString() và nhận được đầu ra bạn được chỉ định.

4
  1. Kiểm tra chính thức MSDN tài liệu, có một danh sách đầy đủ các định dạng DateTime chuỗ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 đều có định dạng "thú vị", nhưng tất cả các loại đều hỗ trợ ToString(). Nếu bạn cần định dạng đối tượng dựng sẵn, bạn có thể thêm phương thức mở rộng để thực hiện, nhưng thường là định dạng được cung cấp ở bất kỳ nơi nào cần thiết (hoặc đặt theo cách khác, tôi chỉ viết định dạng tùy chỉnh cho riêng mình loại). 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 mộ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. Đó là khá đơn giản, bạn chỉ cần kiểm tra các chuỗi cung cấp và viết ra dữ liệu của bạn dựa trên những, không có kỳ diệu đằng sau hậu trường :-)

0

Và để trả lời câu hỏi thứ ba của bạn: Đó 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 IFormatProviderICustomFormatter 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 kéo dài ToString).

3

Dưới trang bìa Chuỗi.Format làm đ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. như thế nào String.Format bản đồ thông tin bổ sung MM/dd/yyyy đến một kết quả chuỗi?

    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?

    Mọi thứ triển khai IFormattable đều có thể thực hiện được.

  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 miễn là bạn thực hiện IFormattable.

Có một số lượng lớn các hỗ trợ các lớp học và điều tra để đảm bảo rằng mặc dù định dạng chuỗi là phần lớn tương tự. More here.

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