2008-09-30 40 views
30

Tôi muốn thực hiện một số điều kiện định dạng chuỗi. Tôi biết rằng bạn có thể thực hiện một số định dạng có điều kiện về số nguyên và phao nổi như sau:Cách định dạng điều kiện một chuỗi trong .Net?

Int32 i = 0; 
i.ToString("$#,##0.00;($#,##0.00);Zero"); 

Đoạn trên sẽ dẫn đến một trong ba định dạng nếu biến là dương, âm hoặc không.

Tôi muốn biết nếu có bất kỳ cách nào để sử dụng các phần trên đối số chuỗi. Đối với một bê tông, nhưng giả tạo Ví dụ, tôi sẽ tìm cách để thay thế "nếu" kiểm tra trong đoạn mã sau:

string MyFormatString(List<String> items, List<String> values) 
{ 
    string itemList = String.Join(", " items.ToArray()); 
    string valueList = String.Join(", " values.ToArray()); 

    string formatString; 

    if (items.Count > 0) 
    //this could easily be: 
    //if (!String.IsNullOrEmpty(itemList)) 
    { 
     formatString = "Items: {0}; Values: {1}"; 
    } 
    else 
    { 
     formatString = "Values: {1}"; 
    } 

    return String.Format(formatString, itemList, valueList); 
} 

Trả lời

1

Đây có lẽ không phải những gì bạn đang tìm kiếm, nhưng làm thế nào về ...

formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}"; 
7

Không phải trong String.Format(), nhưng bạn có thể sử dụng các toán inline C# 's, chẳng hạn như:

return items.Count > 0 
     ? String.Format("Items: {0}; Values: {1}", itemList, valueList) 
     : String.Format("Values: {0}", valueList);   

Điều này sẽ giúp ngăn nắp-up mã.

33

Vâng, bạn có thể đơn giản hóa nó một chút với các nhà điều hành có điều kiện:

string formatString = items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}"; 
return string.Format(formatString, itemList, valueList); 

Hoặc thậm chí bao gồm nó trong báo cáo kết quả giống nhau:

return string.Format(items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}", 
        itemList, valueList); 

Là những gì bạn đang sau? Tôi không nghĩ rằng bạn có thể có một chuỗi định dạng duy nhất mà đôi khi bao gồm các bit và đôi khi nó không.

+4

Không chắc chắn tại sao điều này đã bị bỏ phiếu, vì nó chắc chắn hoạt động ... Bất kỳ cử tri nào cũng quan tâm đến tôi?Nó luôn luôn là tốt đẹp để biết lý do tại sao mọi người không thích câu trả lời - nó làm cho nó dễ dàng hơn để cung cấp những cái tốt hơn trong tương lai. –

+2

Tôn giáo có lẽ .... tôi đoán việc sử dụng toán tử ternary – Quibblesome

+0

Đơn giản hóa? Tuyệt đối lol. Sử dụng ternary 'if' trong ngữ cảnh này là hoàn toàn kỳ quặc. 1. Nếu có trường hợp thứ ba thì sao? 2. Bạn đạt được điều gì bằng cách tiếp cận này - 2 dòng mã ngắn hơn? – agibalov

0

Tôi hy vọng điều này có thể làm điều đó:

return String.Format(items.ToString(itemList + " ;;") + "Values: {0}", valueList); 

Thật không may, có vẻ như phương pháp ToString() không thích các tùy chọn tiêu cực và zero trống hoặc không có một # hoặc 0 bất cứ nơi nào. Tôi sẽ để nó ở đây trong trường hợp nó chỉ cho người khác một câu trả lời tốt hơn.

2
string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}" 
       , itemList 
       , valueList); 
+0

Bạn có thể chỉ cho tôi tài liệu chỉ định bit về bắt đầu từ 0 và không có số bị thiếu không? –

+0

Tôi đã nhầm - tôi đã nhầm lẫn nó với yêu cầu rằng tất cả các số giữ chỗ đều nhỏ hơn độ dài của danh sách đối số. Các đối số không được chấp nhận khi chúng được biến thành các chuỗi rỗng. –

1

Chỉ cần không. Tôi không có ý tưởng cả hai mục và giá trị trong mã của bạn, nhưng tôi tin rằng, cặp này có thể được coi là một thực thể thuộc loại nào đó. Xác định thực thể này là một lớp và ghi đè phương thức ToString() của nó để trả lại bất cứ điều gì bạn muốn. Hoàn toàn không có gì sai khi có if để quyết định cách định dạng chuỗi này tùy thuộc vào một số ngữ cảnh.

3

Trong khi không giải quyết trực tiếp OP, điều này cũng nằm trong tiêu đề câu hỏi.

Tôi thường cần phải định dạng chuỗi với một số đơn vị tùy chỉnh, nhưng trong trường hợp tôi không có dữ liệu, tôi không muốn xuất bất kỳ thứ gì. Tôi sử dụng này với các loại nullable khác nhau:

/// <summary> 
/// Like String.Format, but if any parameter is null, the nullOutput string is returned. 
/// </summary> 
public static string StringFormatNull(string format, string nullOutput, params object[] args) 
{ 
    return args.Any(o => o == null) ? nullOutput : String.Format(format, args); 
} 

Ví dụ, nếu tôi định dạng nhiệt độ như "20 ° C", nhưng gặp phải một giá trị null, nó sẽ in một chuỗi thay thế thay vì "° C".

double? temp1 = 20.0; 
double? temp2 = null; 

string out1 = StringFormatNull("{0}°C", "N/A", temp1); // "20°C" 
string out2 = StringFormatNull("{0}°C", "N/A", temp2); // "N/A" 
Các vấn đề liên quan