2016-02-27 78 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,所以他的解决方案更直接,更快,因为它避免了中间格式字符串。