2010-10-13 49 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。