2011-10-07 21 views
37

我想知道是否有一个为格式化的String.format NULL值,诸如什么Excel使用我可以在string.Format中格式化NULL值吗?

例如,使用Excel我可以指定的{0:#,000.00;-#,000.00,NULL}格式值,这意味着显示数字值作为数字格式的句法如果为正,在括号如果为负,或NULL数字格式,如果该值为null

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

编辑

我正在寻找格式化NULL/Nothing值适用于所有数据类型,而不仅仅是数字类型。

我的例子实际上是不正确的,因为我错误地认为Excel使用第三个参数,如果该值为NULL,但实际上当值为0时使用。我将它留在那里,因为它是我能想到的最接近的东西到我希望做的事情。

我希望能避免空合并运算符,因为我写的日志记录,数据通常不是一个字符串

这将是很容易写类似

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

比写

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'在Visual Basic中)或'0'(零)? – dtb

+0

@dtb我正在寻找格式化'null' /'Nothing' – Rachel

+0

@JimMischel对不起,我在想Excel的格式化NULL值与第三个参数。它实际上是零。我会更新我的问题,但是我将Excel示例放在那里,因为它是我能够想到的最接近的东西。 – Rachel

回答

30

可以定义一个custom formatter返回"NULL"如果该值null否则默认格式化字符串,例如:

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); 
} 

输出:

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

自定义格式化:

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

谢谢,这正是我希望它能工作的原理!你让我的生活变得更轻松:) – Rachel

+0

这不适合我。我正在写一个JsonValueFormatter,并且空值永远不会输入Format方法。如果我做'string.Format(formatter,“Test:{0},{1},{2}”,true,10,null,“Hello”),它返回Test:true,10, '。 –

11

我不认为有一个在String.Format东西,可以让你指定一个特定格式字符串null。一种解决方法是使用null-coalescing operator,就像这样:

const string DefaultValue = "(null)"; 

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

查看我更新的问题。我希望避免使用'??',因为数据通常不是字符串 – Rachel

+1

@Rachel:查看我更新的响应。没有理由需要将空合并运算符限制为字符串。 –

+9

是的,但即使数据类型是数字或日期,我也希望默认值为“NULL”。我不能使用'someNumber? “NULL”,因为字符串“NULL”与“someNumber”的数据类型不同。 – Rachel

2

这是你想要的吗?

string test; 

测试?? “NULL”

+0

查看我更新的问题。我希望避免使用'??',因为数据通常不是字符串 – Rachel

0

你可以使用一个扩展方法:

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

然后在你的代码,你可以这样做:

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

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

这不适用于OP用户案例 – miniBill

相关问题