Csharp/CSharp Tutorial/Class/ICustomFormatter

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

ICustomFormatter IFormatProvider

<source lang="csharp">/* Quote from Accelerated C# 2005

  1. By Trey Nash
  2. ISBN: 1-59059-717-6
  3. 432 pp.
  4. Published: Aug 2006
  • /

using System; using System.Text; using System.Globalization; public class ComplexDbgFormatter : ICustomFormatter, IFormatProvider {

   public object GetFormat( Type formatType ) {
       if( formatType == typeof(ICustomFormatter) ) {
           return this;
       } else {
           return CultureInfo.CurrentCulture.
               GetFormat( formatType );
       }
   }
   public string Format( string format, object arg, IFormatProvider formatProvider ) {
       if( arg.GetType() == typeof(Complex) && format == "DBG" ) {
           Complex cpx = (Complex) arg;
           StringBuilder sb = new StringBuilder();
           sb.Append( arg.GetType().ToString() + " " );
           sb.AppendFormat( "Real:{0} ", cpx.Real );
           sb.AppendFormat( "Img: {0} ", cpx.Img );
           return sb.ToString();
       } else {
           IFormattable formatable = arg as IFormattable;
           if( formatable != null ) {
               return formatable.ToString( format, formatProvider );
           } else {
               return arg.ToString();
           }
       }
   }

} public struct Complex : IFormattable {

   public Complex( double Real, double Img ) {
       this.Real = Real;
       this.Img = Img;
   }
   public string ToString( string format, IFormatProvider formatProvider ) {
       StringBuilder sb = new StringBuilder();
       sb.Append( "( " + Real.ToString(format, formatProvider) );
       sb.Append( " : " + Img.ToString(format, formatProvider) );
       sb.Append( " )" );
       return sb.ToString();
   }
   public double Real;
   public double Img;

} public class MainClass {

   static void Main() {
       CultureInfo local = CultureInfo.CurrentCulture;
       CultureInfo germany = new CultureInfo( "de-DE" );
       Complex cpx = new Complex( 12.3456, 1234.56 );
       string strCpx = cpx.ToString( "F", local );
       Console.WriteLine( strCpx );
       strCpx = cpx.ToString( "F", germany );
       Console.WriteLine( strCpx );
       ComplexDbgFormatter dbgFormatter = new ComplexDbgFormatter();
       strCpx = String.Format( dbgFormatter,"{0:DBG}",  cpx );
       Console.WriteLine( "\nDebugging output:\n{0}", strCpx );
   }

}</source>

( 12.35 : 1234.56 )
( 12,35 : 1234,56 )
Debugging output:
Complex Real:12.3456 Img: 1234.56