zoukankan      html  css  js  c++  java
  • 贴一个MSDN上关于IFormatProvider接口的例子

    Effect C#的第5条讲到了IFormatProvider接口,不太明白于是找到了这个比较具有说明性的例子。

    [C#] 
    // Sample for the IFormatProvider interface and
    // the IFormatProvider.GetFormat( Type ) method.
    using System;
    
    // This class implements the "Ra" formatting code. An instance of this 
    // class should be passed to methods requiring an IFormatProvider.
    public class AnyRadix : ICustomFormatter, IFormatProvider
    {
        // The value to be formatted is returned as a signed string 
        // of digits from the rDigits array. 
        const string radixCode = "Ra";
        private static char[] rDigits = {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
            'U', 'V', 'W', 'X', 'Y', 'Z' };
            
        // This method returns an object that implements ICustomFormatter 
        // to do the formatting. 
        public object GetFormat( Type argType )
        {
            // Here, the same object (this) is returned, but it would 
            // be possible to return an object of a different type.
            if ( argType == typeof( ICustomFormatter ) )
                return this;
            else
                return null;
        } 
            
        // This method does the formatting only if it recognizes the 
        // format codes. 
        public string Format( string formatString, 
            object argToBeFormatted, IFormatProvider provider )
        {
            // If no format string is provided or the format string cannot 
            // be handled, use IFormattable or standard string processing.
            if( formatString == null || 
                ! formatString.Trim( ).StartsWith( radixCode ) )
            {
                if( argToBeFormatted is IFormattable )
                    return ( (IFormattable)argToBeFormatted ).
                        ToString( formatString, provider );
                else
                    return argToBeFormatted.ToString( );
            }
    
            // The formatting is handled here.
            int     digitIndex = 0;
            long    radix;
            long    longToBeFormatted;
            long    longPositive;
            char[ ] outDigits = new char[ 63 ];
                
            // Extract the radix from the format string.
            formatString = formatString.Replace( radixCode, "" );
            try
            {
                radix = Convert.ToInt64( formatString );
            }
            catch( Exception ex )
            {
                throw new ArgumentException( String.Format( 
                    "The radix \"{0}\" is invalid.", 
                    formatString ), ex );
            }
    
            // Verify that the radix is in the proper range.
            if( radix <2 || radix > 36 )
                throw new ArgumentException( String.Format( 
                    "The radix \"{0}\" is not in the range 2..36.", 
                    formatString ) );
                
            // Verify that the argument can be converted to a long integer.
            try
            {
                longToBeFormatted = (long)argToBeFormatted;
            }
            catch( Exception ex )
            {
                throw new ArgumentException( String.Format(
                    "The argument \"{0}\" cannot be " +
                    "converted to an integer value.", 
                    argToBeFormatted ), ex );
            }
                
            // Extract the magnitude for conversion.
            longPositive = Math.Abs( longToBeFormatted );
    
            // Convert the magnitude to a digit string.
            for( digitIndex = 0; digitIndex <= 64; digitIndex++ )
            {
                if( longPositive == 0 ) break;
    
                outDigits[ outDigits.Length - digitIndex - 1 ] = 
                    rDigits[ longPositive % radix ];
                longPositive /= radix;
            }
                
            // Add a minus sign if the argument is negative.
            if( longToBeFormatted < 0 )
                outDigits[ outDigits.Length - digitIndex++ - 1 ] = 
                    '-';
    
            return new string( outDigits, 
                outDigits.Length - digitIndex, digitIndex );
        } 
    } 
    
    class IFormatProviderDemo
    {
        static void ConvertToAnyRadix( object argToConvert, 
            string formatStr )
        {
            AnyRadix    provider = new AnyRadix( );
            string      messageStr = 
                String.Format( "{{0:{0}}}", formatStr );
    
            // Write the first part of the output line.
            Console.Write( "{0,18}  {1,-6}", argToConvert, formatStr );
    
            // Convert the specified argument using the specified format.
            try
            {
                Console.WriteLine( String.Format( 
                    provider, messageStr, argToConvert ) );
            }
            catch( Exception ex )
            {
                // Display the exception without the stack trace.
                int lineEnd = ex.ToString( ).IndexOf( '\n' );
                Console.WriteLine( "{0}\n",
                    ex.ToString( ).Substring( 0, lineEnd ) );
            }
        } 
            
        static void Main( )
        {
            long twoToThe32 = 4294967296;
            long fifteenNines = 999999999999999;
                
            Console.WriteLine(
                "This example of the IFormatProvider interface \n" +
                "and the IFormatProvider.GetFormat( Type ) method " +
                "\ngenerates the following output.\n" );
            Console.WriteLine( "{0,18} Format Result", "Number" );
            Console.WriteLine( "{0,18} ------ ------", "------" );
                
            // These are valid conversions.
            ConvertToAnyRadix( twoToThe32, "Ra2" );
            ConvertToAnyRadix( twoToThe32, "Ra5" );
            ConvertToAnyRadix( twoToThe32, "Ra16" );
            ConvertToAnyRadix( twoToThe32, "Ra23" );
            ConvertToAnyRadix( twoToThe32, "Ra36" );
            ConvertToAnyRadix( fifteenNines, "Ra2" );
            ConvertToAnyRadix( fifteenNines, "Ra3" );
            ConvertToAnyRadix( fifteenNines, "Ra8" );
            ConvertToAnyRadix( fifteenNines, "Ra11" );
            ConvertToAnyRadix( fifteenNines, "Ra16" );
            ConvertToAnyRadix( fifteenNines, "Ra23" );
            ConvertToAnyRadix( fifteenNines, "Ra36" );
            ConvertToAnyRadix( fifteenNines, "E16" );
            ConvertToAnyRadix( fifteenNines, "" );
                
            // These are error conditions.
            ConvertToAnyRadix( fifteenNines, "Ra37" );
            ConvertToAnyRadix( "ABCDEFGHIJKLM", "Ra16" );
        } 
    } 
    
    /*
    This example of the IFormatProvider interface
    and the IFormatProvider.GetFormat( Type ) method
    generates the following output.
    
                Number Format Result
                ------ ------ ------
            4294967296  Ra2   100000000000000000000000000000000
            4294967296  Ra5   32244002423141
            4294967296  Ra16  100000000
            4294967296  Ra23  1606K7IC
            4294967296  Ra36  1Z141Z4
       999999999999999  Ra2   11100011010111111010100100110001100111111111111111
       999999999999999  Ra3   11212010201001210101011021212000
       999999999999999  Ra8   34327724461477777
       999999999999999  Ra11  26A6A3689065639
       999999999999999  Ra16  38D7EA4C67FFF
       999999999999999  Ra23  1134DIFHLMM4
       999999999999999  Ra36  9UGXNORJLR
       999999999999999  E16   9.9999999999999900E+014
       999999999999999        999999999999999
       999999999999999  Ra37  System.ArgumentException: The radix "37" is not in th
    e range 2..36.
    
         ABCDEFGHIJKLM  Ra16  System.ArgumentException: The argument "ABCDEFGHIJKLM
    " cannot be converted to an integer value. ---> System.InvalidCastException: Sp
    ecified cast is not valid.
    */
    
    
    
  • 相关阅读:
    太有才了!街头创意涂鸦手绘图片欣赏【上篇】
    设计前沿:25款精妙的 iOS 应用程序图标
    Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】
    神奇的世界!那些使用食物创造出来的景观【组图】
    Screenfly – 各种设备的屏幕和分辨率下快速测试网站
    经典网页设计:30个新鲜出炉的扁平化网站设计《下篇》
    40款很奇异的名片设计,吸引你的眼球《下篇》
    推荐25款实用的 HTML5 前端框架和开发工具【下篇】
    CSS3 Animation Cheat Sheet:实用的 CSS3 动画库
    今日推荐:12个获取手机应用程序设计灵感的网站
  • 原文地址:https://www.cnblogs.com/awpatp/p/1524866.html
Copyright © 2011-2022 走看看