StringTemplate.Netラーニングノート(6):カスタム出力フォーマット
3484 ワード
STはattributeの出力に対して、デフォルトでattributeを呼び出す.ToString()メソッド.出力フォーマットをカスタマイズする場合は、IAttributeRendererインタフェースを実装する必要があります.
次に、カスタム日付フォーマット出力を定義します.
次の操作を行います.
先に定義したToString(object o)メソッド定義のフォーマットが出力されていることがわかりますが、複数のフォーマットを出力する必要がある場合は、このメソッドは力不足に見えます.
次に、CustomDataRendererクラスを改造し、複数のフォーマットを出力できるようにします.
次の操作を行います.
OK、所期の目的を達成しました.IAttributeRendererインタフェースを実装することで,他の任意のタイプの出力をフォーマットすることができる.なお、各Templateの1つのタイプは1つのRenderしか登録できず、テンプレートグループについてはStringTemplate GroupのSetAttributeRendersメソッドで登録されている.
本住所:http://www.cnblogs.com/lwme/archive/2010/04/30/1725347.html
参照:http://www.antlr.org/wiki/display/ST/Object+rendering#Objectrendering-FormatOption
次に、カスタム日付フォーマット出力を定義します.
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());
:2010 04 30 21 30
先に定義した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 ]
OK、所期の目的を達成しました.IAttributeRendererインタフェースを実装することで,他の任意のタイプの出力をフォーマットすることができる.なお、各Templateの1つのタイプは1つのRenderしか登録できず、テンプレートグループについてはStringTemplate GroupのSetAttributeRendersメソッドで登録されている.
本住所:http://www.cnblogs.com/lwme/archive/2010/04/30/1725347.html
参照:http://www.antlr.org/wiki/display/ST/Object+rendering#Objectrendering-FormatOption