2011-10-07 51 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

相關問題