2010-02-07 35 views
13

Tôi muốn chỉ định định dạng của định dạng ToString, nhưng tôi không chắc chắn cách tốt nhất để xử lý điều này.Làm cách nào để tạo định dạng ToString() tùy chỉnh của riêng tôi?

Ví dụ nếu tôi có specifiers sau

  • EE = thiết bị
  • ED = thiết bị mô tả
  • EI = thiết bị ID

để nếu tôi sử dụng ToString như vậy :

eqp.ToString("EE-EI (ED)") 

đầu ra có thể là:

"CAT994-61 (Front end loader)" 

Cách tốt nhất để tìm kiếm các đế và thay thế mã thông báo là gì? Có ai có ví dụ về việc này không?

Tôi hiện đang làm tuần tự string.Replace, hoạt động độc đáo.

public class Equipment 
{ 
    // (other class code) 

    public string ToString(string format) 
    { 
     string output = format; 
     output = output.Replace("EE", _EquipID); 
     output = output.Replace("ED", _EquipDescription); 
     output = output.Replace("DI", _DepartID); 
     return output; 
    } 

    public override string ToString() 
    { 
     return _EquipID; 
    } 
} 

Trả lời

13

Kết hợp định dạng chuỗi, và quá tải ToString bạn có thể làm điều này:

public override string ToString(string myFormat) 
{ 
    myFormat = myFormat.Replace("EE", "{0}"); 
    myFormat = myFormat.Replace("EI", "{1}"); 
    myFormat = myFormat.Replace("ED", "{2}"); 
    return String.Format(myFormat, this.equipment, this.description, this.id); 
} 

Bạn cũng có thể sử dụng biểu thức thông thường để làm cho các hàm Replace đẹp hơn.


này có thể được sử dụng như sau:

oProd.ToString("EE,ED,EI"); 
oProd.ToString("EE-ED (EI)"); // change order 
oProd.ToString("ED-EE,EE,EE (EI)"); // multiple times 
oProd.ToString("ED:EI"); // have some missing 
etc 

Các String.Format mang đến cho bạn sự linh hoạt để xác định vị trí các biến định dạng bất kỳ cách nào như thế nào, có chúng nhiều lần, hoặc thả một số.

+0

phương thức string.format(), không làm giảm độ linh hoạt, xem chỉnh sửa ở trên của tôi. Tôi đã sử dụng câu trả lời của bạn, nhưng tôi không chắc chắn về điểm trên string.format() – fishhead

0

Sử dụng String.Format.

String.Format("{0}-{1} ({2})", "CAT994", 61, "Front end loader"); 

tạo ra kết quả mong đợi.

+0

vì vậy nếu tôi trộn các thẻ lên như ToString ("EI - EE") nó vẫn sẽ hoạt động? – fishhead

+0

'String.Format (" {1} - {0} ({2}) "," Foo "," Bar "," Baz ");' kết quả trong '" Bar-Foo (Baz) "'. –

0

Bạn chỉ cần quá tải chức năng ToString trong đối tượng của bạn như

public override string ToString() 
{ 
    /* some code handling here */ 
    return ""; //your own formated string 
} 
0

Định dạng âm thanh như một giải pháp tốt.
Có lẽ một (ít) cụm từ thông dụng tốt đẹp để cắt biến đầu vào của bạn thành các nhóm.

tôi sẽ cố gắng sử dụng nhiều định dạng hiện tại nếu bạn có thể:
http://blog.stevex.net/string-formatting-in-csharp/

6

Đầu ghi đè ToString()

Sau đó, nếu bạn muốn nó được động bạn sẽ phải phân tích chuỗi định dạng một mã thông báo tại một thời điểm và thêm chuỗi phù hợp với chuỗi đầu ra của bạn. Việc sử dụng các chỉ định định dạng chữ cái đơn giản sẽ làm cho nó đơn giản hơn một chút vì bạn có thể phân tích cú pháp một ký tự tại một thời điểm. Nếu đó là một ký tự đặc biệt, bạn xuất dữ liệu thích hợp khác, hãy xuất ra ký tự.

Vì vậy, một cái gì đó như thế này

public override string ToString(string format) 
{ 
    StringBuilder s = new StringBuilder(); 

    foreach (char c in format) 
    { 
    switch (c) 
    { 
     case 'E': 
     s.Append(EquipID); 
     break; 
     case 'D': 
     s.Append(EquipDesc); 
     break; 
     case 'I': 
     s.Append(DepartID); 
     break; 
     default: 
     s.Append(c); 
     break; 
    } 
    } 

    return s.ToString(); 
} 

này có lợi thế tương đối nhỏ để làm việc đó trong một vượt qua đó là hiệu quả hơn nhiều chuỗi thay thế các cuộc gọi.

+0

+1, tôi thích nó, nó tốt hơn sau đó thay thế của tôi. – Amirshk

2
String.Format("{0:foo}", object); 

sẽ kết thúc đi "foo"-object.ToString(string format); vì vậy nó làm cho tinh thần để thiết kế các lập luận rằng phương pháp ToString(string format) bạn mất với ý nghĩ đó. Trong ví dụ của bạn

String.Format("{0:EI - EE}", object); 

sẽ cho kết quả trong "EI - EE" được truyền cho phương thức ToString trên đối tượng, vì vậy điều này có thể làm việc như bạn mô tả, nhưng nó có thể làm cho ý nghĩa hơn để hạn chế các định dạng với một đại diện tại một thời gian, như thế này

String.Format("{0:EI} - {0:EE}", object); 

sẽ là cách để có được "CAT994-61" như đầu ra, và ToString() của phương pháp có thể được đơn giản

public override string ToString(string myFormat) 
{ 
    string str = null; 
    switch (myformat.ToLower()) 
    { 
     case "ee": str = this.equipment; break; 
     case "ei": str = this.description; break; 
     case "ed": str = this.id; break; 
     default: str = this.ToString(); break; 
    } 
    return str; 
} 

Nếu bạn giảm định dạng specifiers của bạn để cho đơn ters, sẽ phù hợp hơn với cách các đối tượng khác xử lý các định dạng ToString.

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