2016-02-27 68 views
0

我有可能從intfloatdecimalDateTimeTimeSpan等 裝箱的object現在我想將它與格式字符串轉換爲string,如"D4""P2",或"yyyyMMdd"。但object類沒有接收格式字符串的ToString方法。所以下面的代碼不起作用。如何將對象轉換爲格式字符串的字符串?

string Format(object value, string format) 
{ 
    return value.ToString(format); // error 
} 

下面是我醜陋的解決方法。

string Format(object value, string format) 
{ 
    if (value is int) return ((int)value).ToString(format); 
    if (value is float) return ((float)value).ToString(format); 
    if (value is double) return ((double)value).ToString(format); 
    if (value is decimal) return ((decimal)value).ToString(format); 
    if (value is DateTime) return ((DateTime)value).ToString(format); 
    if (value is TimeSpan) return ((TimeSpan)value).ToString(format); 
    ... 
} 

有沒有更智能的方法?

+0

您的代碼並沒有真正意義 - 所有這些類型都有不同的適用格式字符串,但是'Format'方法給人的印象是任何格式字符串都可以任意應用於任何對象(顯然不是這種情況)。在我看來,你需要首先解開對象,然後決定使用什麼格式的字符串...? –

+0

我不明白你爲什麼不重寫ToString()方法。或者你爲什麼在那裏得到一個錯誤。 –

回答

3

沒有爲一個接口,它是IFormattable

public static string Format(object value, string format, IFormatProvider formatProvider = null) 
{ 
    if (value == null) 
    { 
     return string.Empty; 
    } 

    IFormattable formattable = value as IFormattable; 

    if (formattable != null) 
    { 
     return formattable.ToString(format, formatProvider); 
    } 

    throw new ArgumentException("value"); 
} 

(這個接口是一個由各種string.FormatConsole.Write使用,...)

2

您可以使用複合格式字符串與String.Format(String format, params Object[] args)達到你想要的效果,而不會自己實現它:

public static String Format(Object value, String format) { 

    return String.Format(CultureInfo.InvariantCulture, "{0:" + format + "}", value); 
} 

「複合格式化」是當值格式字符串(例如F2u)作爲一個提供正常格式化字符串中的可選冒號後面的格式參數,格式爲{0:$valueFormat}

此外,請記得始終指定一個CultureInfo參數值,以實現跨計算機的可預測行爲。

更新:查看@xanatos的解決方案。複合格式使用IFormattable,所以他的解決方案更直接,更快,因爲它避免了中間格式字符串。