Use additional renderers like this實現介面的類:
| 代碼如下 |
複製代碼 |
internal class AdvancedDateTimeRenderer : IAttributeRenderer { public string ToString(object o) { return ToString(o, null); } public string ToString(object o, string formatName) { if (o == null) return null; if (string.IsNullOrEmpty(formatName)) return o.ToString(); DateTime dt = Convert.ToDateTime(o); return string.Format("{0:" + formatName + "}", dt); } }
|
and then add this to your StringTemplate such as把類註冊到模板組中:
| 代碼如下 |
複製代碼 |
var stg = new StringTemplateGroup("Templates", path); stg.RegisterAttributeRenderer(typeof(DateTime), new AdvancedDateTimeRenderer());
|
then in st file模板檔案中的寫法:
| 代碼如下 |
複製代碼 |
$YourDateVariable; format="dd/mm/yyyy"$ |
另一種方法 預設都是調用attribute.ToString()方法。如果要自訂輸出格式,則需要實現IAttributeRenderer介面。下面來定義一個自訂日期格式化輸出:
| 代碼如下 |
複製代碼 |
class CustomDataRenderer : IAttributeRenderer { public string ToString(object o) { if (o == null) return null; string str = o.ToString(); DateTime dt; if (!DateTime.TryParse(o.ToString(), out dt)) return str; return dt.ToString("yyyy年MM月dd日 HH點mm分"); } public string ToString(object o, string formatName) { throw new NotImplementedException(); } } |
使用:
| 代碼如下 |
複製代碼 |
StringTemplate st = new StringTemplate("$d$"); st.RegisterRenderer(typeof(DateTime), new CustomDataRenderer());//在當前Template註冊DateTime類型的預設輸出格式 st.SetAttribute("d", DateTime.Now); Console.WriteLine(st.ToString()); |
可以看到輸出了前面定義的ToString(object o)方法定義的格式,那麼如果需要輸出多種格式,這個方法就顯得力不從心了。
接下來改造CustomDataRenderer類,使它能輸出多種格式:
| 代碼如下 |
複製代碼 |
/// <summary> /// 自訂ST日期格式輸出 /// </summary> class CustomDataRenderer : IAttributeRenderer { /// <summary> /// 預設的輸出方法 /// </summary> public string ToString(object o) { return ToString(o, null); } /// <summary> /// 指定輸出格式時的輸出方法 /// </summary> /// <param name="formatName">格式名稱</param> public string ToString(object o, string formatName) { if (o == null) return null; string str = o.ToString(); DateTime dt; if (!DateTime.TryParse(o.ToString(), out dt)) return str; switch (formatName) { case "CNDate": return dt.ToString("yyyy年MM月dd日"); case "CNTime": return dt.ToString("HH點mm分"); default : return dt.ToString("yyyy年MM月dd日 HH點mm分"); } } }
使用: StringTemplate st = new StringTemplate("[$d1$] [$d2;format="CNDate"$] [$d3;format="CNTime"$]"); st.RegisterRenderer(typeof(DateTime), new CustomDataRenderer());//在當前Template註冊DateTime類型的預設輸出格式 st.SetAttribute("d1", DateTime.Now); st.SetAttribute("d2", DateTime.Now); st.SetAttribute("d3", DateTime.Now); Console.WriteLine(st.ToString()); |
輸出:[2010年04月30日 21點40分] [2010年04月30日] [21點40分]