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分]