• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            IFormattable,IFormatProvider,ICustomFormatter 接口的實現

            .NET Framework提供了方法,能夠將任何數值、枚舉以及日期和時間等基數據類型表示為字符串
            格式化由格式說明符字符的字符串控制,該字符串指示如何表示基類型值
            例如,格式說明符指示:是否應該用科學記數法來表示格式化的數字
            例如:格式字符"C",說明貨幣格式

            同時.NET Framework還使用區域性設置,以便用適合于特定區域性的形式表示基類型。
            我們可以提供自定義的區域性設置,或者使用與當前線程關聯的默認區域性設置。
            例如,格式化貨幣類型的時候,區域性設置指定用于貨幣符號

            要是我們想擁有自己定義的格式化,.NET Framework也允許我們定義自己格式化方案和自定義區域性設置。
            例如:我想格式字符"MyFormat",來說明我自定義的格式,即在字符前加三個***

            關于數字格式字符串,可以參考類
            System.Globalization.NumberFormatInfo
            關于日期與時間格式字符串,可以參考類
            System.Globalization.DateTimeFormatInfo

            先看看IFormattable接口的原型
            public interface IFormattable
            {
            ????? // Methods
            ????? string ToString(string format, IFormatProvider formatProvider);
            }
            參數說明:
            format
            指定要使用的格式的 String
            當為空引用時,表示使用為 IFormattable 實現的類型定義的默認格式
            formatProvider
            用于格式化該值的 IFormatProvider
            當為空引用時,從操作系統的當前區域設置中獲取格式信息的

            一些基本的值類型實現了該接口,例如:
            Int32 ,UInt32 , DateTime ,Guid ,類Enum

            再看看IFormatProvider接口的原型
            public interface IFormatProvider
            {
            ????? // Methods
            ????? object GetFormat(Type formatType);
            }
            參數說明:
            formatType
            一個對象,它指定要獲取的格式對象的類型

            NumberFormatInfo、DateTimeFormatInfo和CultureInfo實現IFormatProvider接口

            NumberFormatInfo提供數字格式信息,如用于小數分隔符和千位分隔符的字符,以及貨幣值中貨幣符號的拼寫和位置
            DateTimeFormatInfo提供與日期相關和與時間相關的格式信息,如日期模式中月、日和年的位置
            CultureInfo包含特定區域性中的默認格式信息,其中包括數字格式信息以及與日期相關和與時間相關的格式信息

            再看看ICustomFormatter接口的原型
            public interface ICustomFormatter
            {
            ????? // Methods
            ????? string Format(string format, object arg, IFormatProvider formatProvider);
            }
            參數說明:
            format
            包含格式規范的格式字符串
            arg
            要格式化的對象
            formatProvider
            一個 IFormatProvider 對象,它提供有關當前實例的格式信息


            在arg為空引用時,引發異常
            如果 format 為空引用 ,將使用默認格式規范
            如果 formatProvider 為空引用 ,則忽略該參數

            好了,說了這么多
            我們來動手來實現格式字符"MyFormat",在字符前加三個***的需求

            定義一個類

            using ?System;

            namespace ?MyFormat
            {
            ????
            public ? class ?MyClass?:?System.IFormattable
            ????
            {
            ????????Double?d;

            ????????
            public ?MyClass(Double?d)
            ????????
            {
            ????????????
            this .d = d;
            ????????}


            ????????
            public ? string ?ToString( string ?format,?IFormatProvider?formatProvider)
            ????????
            {
            ????????????
            return ?(format == " MyFormat " ) ? " *** " + d.ToString(formatProvider):d.ToString(format,formatProvider);
            ????????}

            ????}

            }
            再到一控制臺中
            System.Globalization.CultureInfo?culture=null;

            ????????????MyClass?myClass
            =new?MyClass(5);
            ????????????
            //當IFormatProvider為空時,調用的是當前線程關聯的文化信息
            ????????????Console.WriteLine("顯示中國貨幣格式:{0}",myClass.ToString("C",null));

            ????????????culture
            =System.Globalization.CultureInfo.CurrentCulture;
            ????????????Console.WriteLine(
            "顯示當前系統默認貨幣格式:{0}",myClass.ToString("C",culture));

            ????????????culture
            =new?System.Globalization.CultureInfo("zh-HK");
            ????????????Console.WriteLine(
            "顯示香港特別行政區貨幣格式:{0}",myClass.ToString("C",culture));

            ????????????Console.WriteLine(
            "顯示我自己定義的貨幣格式:{0}",myClass.ToString("MyFormat",null));
            ????????????
            ????????????Console.ReadLine();

            效果如下:


            如果希望自定義格式化能在多個不同類使用,那么實現我們應該實現ICustomFormatter接口

            定義一個類

            using?System;

            namespace?MyFormat
            {
            ????
            public?class?MyBaseFormat?:?System.ICustomFormatter,?System.IFormatProvider
            ????
            {
            ????????
            //如果format?Type與當前實例類型相同,則為當前實例,否則為空引用
            ????????public?object?GetFormat(Type?format)
            ????????
            {
            ????????????
            if?(format?==?typeof?(ICustomFormatter))
            ????????????????
            return?this;
            ????????????
            return?null;
            ????????}


            ????????
            //實現Format方法說明:
            ????????
            //如果您的格式方法不支持格式,則確定正在設置格式的對象是否實現?IFormattable?接口。
            ????????
            //如果實現,請調用該接口的IFormattable.ToString?方法。
            ????????
            //否則,調用基礎對象的默認?Object.ToString?方法。
            ????????public?string?Format?(string?format,?object?arg,?IFormatProvider?provider)
            ????????
            {
            ????????????
            if?(format?==?null)
            ????????????
            {
            ????????????????
            if?(arg?is?IFormattable)
            ????????????????????
            return?((IFormattable)arg).ToString(format,?provider);
            ????????????????
            return?arg.ToString();
            ????????????}

            ????????????
            else
            ????????????
            {
            ????????????????
            if?(format=="MyBaseFormat")??
            ????????????????
            {
            ????????????????????
            return?"***"+arg.ToString();
            ????????????????}

            ????????????????
            else
            ????????????????
            {
            ????????????????????
            if?(arg?is?IFormattable)
            ????????????????????????
            return?((IFormattable)arg).ToString(format,?provider);
            ????????????????????
            return?arg.ToString();
            ????????????????}

            ????????????}

            ????????}

            ????}

            }

            到一控制臺中
            ????????????string?printString=String.Empty;
            ????????????
            int?i=100;
            ????????????MyBaseFormat?myBaseFormat
            =new?MyBaseFormat();

            ????????????printString
            =string.Format(myBaseFormat,"顯示正常格式:{0}",i);
            ????????????Console.WriteLine(printString);
            ????????????printString
            =string.Format(myBaseFormat,"顯示正常格式:{0:C}",i);
            ????????????Console.WriteLine(printString);
            ????????????printString
            =string.Format(myBaseFormat,"顯示自定義格式{0:MyBaseFormat}",i);
            ????????????Console.WriteLine(printString);

            ????????????Console.ReadLine();

            效果如下:


            小總結:
            1.如果需要您自己的格式化包含在某個類上,在該類上實現IFormattable接口
            2.如果希望自定義格式化并使它可供多個不同類使用,那么實現 ICustomFormatter接口



            希望上面提到的知識對你有所提示
            當然歡迎交流和指正

            blog:
            http://www.cnblogs.com/aierong
            author:aierong
            email:aierong@126.com

            寫隨筆費時又費力,請尊重作者的權利
            謝謝!
            namespace?Microshaoft
            {
            ????
            using?System;

            ????
            public?class?ChineseFormat?:?System.ICustomFormatter,?System.IFormatProvider
            ????
            {
            ????????
            //如果format?Type與當前實例類型相同,則為當前實例,否則為空引用?
            ????????public?object?GetFormat(Type?format)
            ????????
            {
            ????????????
            if?(format?==?typeof?(ICustomFormatter))
            ????????????
            {
            ????????????????
            return?this;
            ????????????}

            ????????????
            return?null;
            ????????}


            ????????
            //實現Format方法說明:?
            ????????
            //如果您的格式方法不支持格式,則確定正在設置格式的對象是否實現?IFormattable?接口。?
            ????????
            //如果實現,請調用該接口的IFormattable.ToString?方法。?
            ????????
            //否則,調用基礎對象的默認?Object.ToString?方法。?
            ????????public?string?Format(string?format,?object?arg,?IFormatProvider?provider)
            ????????
            {
            ????????????
            if?(format?==?null)
            ????????????
            {
            ????????????????
            if?(arg?is?IFormattable)
            ????????????????
            {
            ????????????????????
            return?((IFormattable)?arg).ToString(format,?provider);
            ????????????????}

            ????????????????
            return?arg.ToString();
            ????????????}

            ????????????
            else
            ????????????
            {
            ????????????????
            if?(format?==?"ChineseFormat")
            ????????????????
            {
            ????????????????????
            string[]?Nums?=?new?string[]?{"",?"",?"",?"",?"",?"",?"",?"",?"",?""};
            ????????????????????
            //位?數組?
            ????????????????????string[]?Digits?=?new?string[]?{"",?"",?"",?""};
            ????????????????????
            //單位?數組?
            ????????????????????string[]?Units?=?new?string[]?{"",?"[萬]",?"[億]",?"[萬億]"};
            ????????????????????
            return?ConvertNumberToChinese(arg.ToString(),?Nums,?Digits,?Units);
            ????????????????????
            //return?"***"+arg.ToString();?
            ????????????????}

            ????????????????
            else
            ????????????????
            {
            ????????????????????
            if?(arg?is?IFormattable)
            ????????????????????
            {
            ????????????????????????
            return?((IFormattable)?arg).ToString(format,?provider);
            ????????????????????}

            ????????????????????
            return?arg.ToString();
            ????????????????}

            ????????????}

            ????????}


            ????????
            public?static?string?ConvertNumberToChinese(string?x,?string[]?Nums,?string[]?Digits,?string[]?Units)
            ????????
            {
            ????????????
            string?S?=?"";?//返回值?
            ????????????int?p?=?0;?//字符位置指針?
            ????????????int?m?=?x.Length?%?4;?//取模?

            ????????????
            //?四位一組得到組數?
            ????????????int?k?=?(m?>?0???x.Length?/?4?+?1?:?x.Length?/?4);

            ????????????
            //?外層循環在所有組中循環?
            ????????????
            //?從左到右?高位到低位?四位一組?逐組處理?
            ????????????
            //?每組最后加上一個單位:?"[萬億]","[億]","[萬]"?
            ????????????for?(int?i?=?k;?i?>?0;?i--)
            ????????????
            {
            ????????????????
            int?L?=?4;
            ????????????????
            if?(i?==?k?&&?m?!=?0)
            ????????????????
            {
            ????????????????????L?
            =?m;
            ????????????????}

            ????????????????
            //?得到一組四位數?最高位組有可能不足四位?
            ????????????????string?s?=?x.Substring(p,?L);
            ????????????????
            int?l?=?s.Length;

            ????????????????
            //?內層循環在該組中的每一位數上循環?從左到右?高位到低位?
            ????????????????for?(int?j?=?0;?j?<?l;?j++)
            ????????????????
            {
            ????????????????????
            //處理改組中的每一位數加上所在位:?"仟","佰","拾",""(個)?
            ????????????????????int?n?=?Convert.ToInt32(s.Substring(j,?1));
            ????????????????????
            if?(n?==?0)
            ????????????????????
            {
            ????????????????????????
            if?(j?<?l?-?1
            ????????????????????????????
            &&?Convert.ToInt32(s.Substring(j?+?1,?1))?>?0?//后一位(右低)?
            ????????????????????????????&&?!S.EndsWith(Nums[n]))
            ????????????????????????
            {
            ????????????????????????????S?
            +=?Nums[n];
            ????????????????????????}

            ????????????????????}

            ????????????????????
            else
            ????????????????????
            {
            ????????????????????????
            //處理?1013?一千零"十三",?1113?一千一百"一十三"?
            ????????????????????????if?(!(n?==?1?&&?(S.EndsWith(Nums[0])?|?S.Length?==?0)?&&?j?==?l?-?2))
            ????????????????????????
            {
            ????????????????????????????S?
            +=?Nums[n];
            ????????????????????????}

            ????????????????????????S?
            +=?Digits[l?-?j?-?1];
            ????????????????????}

            ????????????????}

            ????????????????p?
            +=?L;
            ????????????????
            //?每組最后加上一個單位:?[萬],[億]?等?
            ????????????????if?(i?<?k)?//不是最高位的一組?
            ????????????????{
            ????????????????????
            if?(Convert.ToInt32(s)?!=?0)
            ????????????????????
            {
            ????????????????????????
            //如果所有?4?位不全是?0?則加上單位?[萬],[億]?等?
            ????????????????????????S?+=?Units[i?-?1];
            ????????????????????}

            ????????????????}

            ????????????????
            else
            ????????????????
            {
            ????????????????????
            //處理最高位的一組,最后必須加上單位?
            ????????????????????S?+=?Units[i?-?1];
            ????????????????}

            ????????????}

            ????????????
            return?S;
            ????????}

            ????}

            }


            namespace?Test
            {
            ????
            using?System;
            ????
            using?Microshaoft;

            ????
            class?AppTest
            ????
            {
            ????????
            static?void?Main()
            ????????
            {
            ????????????
            string?printString?=?String.Empty;
            ????????????
            long?i?=?1100000013;
            ????????????ChineseFormat?fmt?
            =?new?ChineseFormat();

            ????????????printString?
            =?string.Format(fmt,?"顯示正常格式:?{0}",?i);
            ????????????Console.WriteLine(printString);
            ????????????printString?
            =?string.Format(fmt,?"顯示正常格式:?{0:C}",?i);
            ????????????Console.WriteLine(printString);
            ????????????printString?
            =?string.Format(fmt,?"顯示自定義格式:?{0:ChineseFormat}",?i);
            ????????????Console.WriteLine(printString);

            ????????????Console.ReadLine();
            ????????}

            ????}

            }

            來自:aierong原創技術隨筆(.Net方向應用)

            posted on 2006-04-18 17:21 夢在天涯 閱讀(757) 評論(0)  編輯 收藏 引用 所屬分類: C#/.NET

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804363
            • 排名 - 5

            最新評論

            閱讀排行榜

            日韩精品久久无码人妻中文字幕 | 天天躁日日躁狠狠久久 | 一日本道伊人久久综合影| 亚洲精品无码久久毛片| 久久婷婷五月综合色高清| 精品久久久久久99人妻| 中文字幕精品久久| 久久不射电影网| 人妻无码αv中文字幕久久琪琪布| 久久久久久夜精品精品免费啦| 日本道色综合久久影院| 无码八A片人妻少妇久久| 国产精品久久久久久搜索| 国产精品中文久久久久久久| 国产精品一久久香蕉产线看| 久久免费99精品国产自在现线 | 国产Av激情久久无码天堂| 精品久久久久久无码人妻热 | 国产A三级久久精品| 精品综合久久久久久88小说| 久久久亚洲裙底偷窥综合| 精品久久久久久久久久中文字幕| 久久国产免费观看精品| 中文字幕人妻色偷偷久久| 一本久久a久久精品综合香蕉 | 久久久久97国产精华液好用吗| 国产精品国色综合久久| 亚洲国产成人久久综合碰| 国产精品va久久久久久久| 久久精品国产亚洲综合色| 国内精品久久久久伊人av| 久久久亚洲欧洲日产国码aⅴ| 无码超乳爆乳中文字幕久久 | 国内精品久久久久久久涩爱| 久久夜色精品国产噜噜噜亚洲AV | 区久久AAA片69亚洲| 久久精品国产亚洲精品| yellow中文字幕久久网| 国产91久久综合| 国产精品成人久久久久三级午夜电影| 国产精品久久久天天影视香蕉|