StringTemplate.Netラーニングノート(6):カスタム出力フォーマット

3484 ワード

STはattributeの出力に対して、デフォルトで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());
	 :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