2010-10-13 45 views

回答

2

似乎没有类似的东西,请参阅下文。

最推荐的方法做到这一点:

var d = DateTime.Now; 
var result2 = String.Format("{0:dd}{1} {2:MMM yyyy}", d, Ordinal(d.Day), d); 

一个非常哈克的方式去实现它是创建一个自定义IFormatProvider。 IMO它只是一个很大的麻烦,但只是为了显示一种替代方式...(我没有与这么多的经验,它可能不是很“正确”)

using System; 

namespace Test 
{ 
    class Program 
    { 
     public static string Ordinal(int number) 
     { 
      string suffix = String.Empty; 

      int ones = number % 10; 
      int tens = (int)Math.Floor(number/10M) % 10; 

      if (tens == 1) 
      { 
       suffix = @"\t\h"; 
      } 
      else 
      { 
       switch (ones) 
       { 
        case 1: 
         suffix = @"\s\t"; 
         break; 

        case 2: 
         suffix = @"\n\d"; 
         break; 

        case 3: 
         suffix = @"\r\d"; 
         break; 

        default: 
         suffix = @"\t\h"; 
         break; 
       } 
      } 
      return suffix; 
     } 

     public class MyFormat : IFormatProvider, ICustomFormatter 
     { 
      public object GetFormat(Type formatType) 
      { 
       return (formatType == typeof(ICustomFormatter)) ? this : null; 

      } 

      public string Format(string format, object arg, IFormatProvider formatProvider) 
      { 
       var d = (DateTime)arg; 

       var or = Ordinal(d.Day); 

       format = format.Replace("or", or); 

       return d.ToString(format); 
      } 
     } 
     static void Main(string[] args) 
     { 
      var result = String.Format(new MyFormat(), "{0:ddor MMM yyyy}.", DateTime.Now); 

      return; 
     } 
    } 
} 

More info on Custom IFormatProvider

+0

感谢您的答案布鲁诺。但是我正在寻找一种不会对用户造成太大干扰的方法。 – Simon 2010-10-13 01:50:52

1

格式提供程序是可插入的,但据我所知,您无法为给定类型设置默认格式提供程序。按照约定采用格式字符串的方法通常也会有一个采用IFormatProvider的重载。您可以实现两个类,例如MyFormatProvider:IFormatProvider和MyCustomFormatter:ICustomFormatter

当处理格式字符串如“{0:dd} {0:或} {0:MMM} {0:yyyy}”时,您的ICustomFormatter将被调用4次,其中“dd”,“或“,”MMM“和”yyyy“作为参数,因此它可以分别格式化每个部分。您只需处理“或”情况,并将其余部分传递给默认格式提供者。

但是,调用程序在格式化时仍然需要传入自定义格式提供程序的实例。例如:

string str = String.Format(MyFormatProvider.Default, "{0:dd}{0:or} {0:MMM} {0:yyyy}", date); 

据我所知,没有逃脱的要求。我创建了一个“相对”DateTime格式的字符串,显示DateTimes,比如“1小时前”,“3天前”等,我搜索了一个更好的方法。无法找出避免必须明确传递我的自定义IFormatProvider。