2011-10-07 33 views
37

Tôi đã tự hỏi nếu có một cú pháp để định dạng giá trị NULL trong chuỗi.Format, chẳng hạn như những gì Excel sử dụngTôi có thể định dạng các giá trị NULL trong string.Format không?

Ví dụ, sử dụng Excel tôi có thể chỉ định giá trị định dạng {0:#,000.00;-#,000.00,NULL}, có nghĩa là hiển thị giá trị số dưới dạng số nếu dương tính, định dạng số trong ngoặc đơn nếu tiêu cực, hoặc NULL nếu giá trị là null

string.Format("${0:#,000.00;(#,000.00);NULL}", someNumericValue); 

Sửa

tôi đang tìm để định dạng NULL/Nothing giá trị cho tất cả các loại dữ liệu, không chỉ các loại dữ liệu.

Ví dụ của tôi thực sự không đúng vì tôi nhầm tưởng Excel sử dụng tham số thứ 3 nếu giá trị NULL, nhưng nó thực sự được sử dụng khi giá trị bằng 0. Tôi để nó ở đó vì đó là điều gần nhất tôi có thể nghĩ đến với những gì tôi đã hy vọng làm.

tôi hy vọng để tránh các nhà điều hành coalescing null vì tôi viết bản ghi log, và các dữ liệu không phải là thường là một chuỗi

Nó sẽ dễ dàng hơn nhiều để viết một cái gì đó giống như

Log(string.Format("Value1 changes from {0:NULL} to {1:NULL}", 
    new object[] { oldObject.SomeValue, newObject.SomeValue })); 

hơn viết

var old = (oldObject.SomeValue == null ? "null" : oldObject.SomeValue.ToString()); 
var new = (newObject.SomeValue == null ? "null" : newObject.SomeValue.ToString()); 

Log(string.Format("Value1 changes from {0} to {1}", 
    new object[] { old, new })); 
+0

'null' (' Nothing' in Visual Basic) hoặc '0' (zero)? – dtb

+0

@dtb Tôi đang tìm định dạng 'null' /' Nothing' – Rachel

+0

@JimMischel Xin lỗi, tôi đã suy nghĩ các giá trị NULL được định dạng Excel với tham số thứ 3. Nó thực sự là số không. Tôi sẽ cập nhật câu hỏi của mình, nhưng tôi để lại ví dụ Excel ở đó vì đó là điều gần nhất tôi có thể nghĩ đến những gì tôi đang tìm kiếm. – Rachel

Trả lời

30

Bạn có thể định nghĩa một custom formatter trả "NULL" nếu giá trị là null và nếu không thì chuỗi định dạng mặc định, ví dụ:

foreach (var value in new[] { 123456.78m, -123456.78m, 0m, (decimal?)null }) 
{ 
    string result = string.Format(
     new NullFormat(), "${0:#,000.00;(#,000.00);ZERO}", value); 
    Console.WriteLine(result); 
} 

Output:

$123.456,78 
$(123.456,78) 
$ZERO 
$NULL 

Tuỳ chỉnh Formatter:

public class NullFormat : IFormatProvider, ICustomFormatter 
{ 
    public object GetFormat(Type service) 
    { 
     if (service == typeof(ICustomFormatter)) 
     { 
      return this; 
     } 
     else 
     { 
      return null; 
     } 
    } 

    public string Format(string format, object arg, IFormatProvider provider) 
    { 
     if (arg == null) 
     { 
      return "NULL"; 
     } 
     IFormattable formattable = arg as IFormattable; 
     if (formattable != null) 
     { 
      return formattable.ToString(format, provider); 
     } 
     return arg.ToString(); 
    } 
} 
+0

Cảm ơn bạn, hoạt động chính xác như thế nào tôi đã hy vọng nó sẽ làm việc! Bạn vừa làm cho cuộc sống của tôi dễ dàng hơn rất nhiều :) – Rachel

+0

Điều này không hiệu quả đối với tôi. Tôi đang viết một JsonValueFormatter và giá trị null không bao giờ được nhập vào phương thức Format. Nếu tôi làm 'string.Format (formatter," Test: {0}, {1}, {2} ", true, 10, null," Hello ")' nó trả về 'Test: true, 10,," Hello " '. –

11

tôi không nghĩ rằng có bất cứ điều gì trong String.Format mà sẽ cho phép bạn chỉ định một định dạng đặc biệt đối với null chuỗi. Giải pháp thay thế là sử dụng số null-coalescing operator, như sau:

const string DefaultValue = "(null)"; 

string s = null; 
string formatted = String.Format("{0}", s ?? DefaultValue); 
+0

Xem câu hỏi được cập nhật của tôi. Tôi đã hy vọng tránh sử dụng '??' vì dữ liệu thường không phải là một chuỗi – Rachel

+1

@Rachel: Xem phản hồi được cập nhật của tôi. Không có lý do gì bạn cần phải hạn chế toán tử null-coalescing thành chuỗi. –

+9

Có, nhưng tôi muốn giá trị mặc định là '" NULL "' ngay cả khi kiểu dữ liệu là số hoặc ngày tháng. Tôi không thể sử dụng 'someNumber ?? "NULL" 'vì chuỗi' "NULL" 'không phải là kiểu dữ liệu giống như' someNumber' – Rachel

2

Đây có phải là điều bạn muốn không?

string test; 

kiểm tra ?? "NULL"

+0

Xem câu hỏi được cập nhật của tôi. Tôi đã hy vọng tránh sử dụng '??' vì dữ liệu thường không phải là một chuỗi – Rachel

1

Dường như String.Format cho .NET hoạt động giống như Excel, tức là bạn có thể sử dụng dấu phân cách ; cho giá trị dương, âm và 0, nhưng không phải là NULL: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator.

Bạn sẽ có lẽ chỉ có để xử lý các giá trị null bằng tay:

if (myval == null) 
    // handle 
else 
    return String.Format(...); 
0

Bạn có thể sử dụng một phương pháp khuyến nông:

public static string ToDataString(this string prm) 
    { 
     if (prm == null) 
     { 
      return "NULL"; 
     } 
     else 
     { 
      return "'" + prm.Replace("'", "''") + "'"; 
     } 
    } 

Sau đó, trong mã của bạn, bạn có thể làm:

string Field1="Val"; 
string Field2=null; 

string s = string.Format("Set Value:{0}, NullValue={1}",Field1.ToDataString(), Field2.ToDataString()); 
+1

Thao tác này sẽ không hoạt động đối với trường hợp người dùng OP – miniBill

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