青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 夢在天涯 閱讀(765) 評論(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

搜索

  •  

積分與排名

  • 積分 - 1812208
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              美女国产精品| 99精品免费网| 欧美自拍偷拍午夜视频| 亚洲国产成人91精品| 国产欧美91| 国产精品美腿一区在线看| 欧美激情亚洲| 欧美午夜美女看片| 久久精品国产一区二区三| 亚洲激情在线观看| 亚洲人成网站777色婷婷| 男女激情视频一区| 亚洲第一主播视频| 日韩亚洲视频在线| 日韩视频精品在线| 欧美亚洲色图校园春色| 久久精品99无色码中文字幕| 亚洲一区二区三区精品视频| 亚洲人成人99网站| 午夜伦欧美伦电影理论片| 欧美在线视频网站| 亚洲精品资源美女情侣酒店| 亚洲日本aⅴ片在线观看香蕉| 一区二区高清| 欧美一区二区视频观看视频| 欧美专区在线观看一区| 欧美大胆成人| 一区二区在线视频播放| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 国产日产精品一区二区三区四区的观看方式| 欧美午夜精品一区| 一区精品在线| 亚洲图片在线| 亚洲国产日韩欧美一区二区三区| 一区二区三区|亚洲午夜| 久久一区二区三区四区| 国产精品久久综合| 中文亚洲免费| 亚洲伦伦在线| 久久久999成人| 国产乱子伦一区二区三区国色天香 | 亚洲品质自拍| 国产亚洲欧美一级| 午夜精品一区二区三区四区| 久久人人97超碰国产公开结果| 99热这里只有成人精品国产| 亚洲手机视频| 欧美日韩成人一区二区| 亚洲精品一区二区三区婷婷月| 久久久久欧美精品| 久久躁日日躁aaaaxxxx| 国产一区二区三区久久久| 欧美一区永久视频免费观看| 亚洲第一在线综合在线| 欧美日韩在线播放一区| 亚洲视频免费在线| 午夜精品久久久久久久久久久久久 | 亚洲国产色一区| 欧美福利在线观看| 久久精品91久久久久久再现| 亚洲小说区图片区| 亚洲成人影音| 亚洲精品欧美日韩专区| 国产美女高潮久久白浆| 性欧美1819sex性高清| 午夜精品久久久久久99热| 在线精品观看| 国产精品99久久久久久久女警 | 欧美h视频在线| 欧美日韩一区二区三区四区五区| 亚洲在线免费视频| 亚洲国产婷婷香蕉久久久久久99| 国产精品r级在线| 免费黄网站欧美| 国产精品视频导航| 亚洲一区二区三区在线看| 亚洲高清不卡av| 欧美一区二区三区日韩视频| 国产偷久久久精品专区| 亚洲精品美女在线| 亚洲国产一区二区a毛片| 久久狠狠婷婷| 亚洲一区二区免费看| 久久综合影视| 欧美插天视频在线播放| 国内久久婷婷综合| 久久综合中文| 午夜精品亚洲| 欧美午夜三级| 午夜精品福利视频| 亚洲电影激情视频网站| 日韩视频一区二区在线观看| 久久精品视频在线观看| 欧美xart系列在线观看| 亚洲第一黄色网| 欧美日韩免费观看一区| 性亚洲最疯狂xxxx高清| 久久亚洲综合色| 日韩一级裸体免费视频| 国产精品亚洲欧美| 欧美福利一区二区三区| 亚洲午夜精品一区二区三区他趣| 欧美在线免费| 日韩亚洲在线观看| 国产亚洲一区二区精品| 欧美日韩精品免费观看视频完整| 亚洲天堂男人| 亚洲日韩欧美视频| 欧美高潮视频| 国产精品国产a| 欧美日韩国产成人在线| 美女免费视频一区| 久久综合五月| 日韩视频在线观看国产| 久久精品国产清自在天天线| 亚洲风情在线资源站| 国产综合自拍| 一区二区三区无毛| 精品999在线播放| 国产一区自拍视频| 国内免费精品永久在线视频| 欧美亚洲成人网| 国产精品高清在线| 一区二区在线不卡| 亚洲人成在线播放| av成人福利| 久久国产精品99国产精| 久久婷婷成人综合色| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲欧美日韩在线| 欧美国产精品一区| 99香蕉国产精品偷在线观看| 亚洲国产三级在线| 亚洲欧美中文日韩在线| 久久久噜噜噜久噜久久| 欧美www在线| 国产午夜精品在线| 亚洲图片欧美一区| 鲁大师影院一区二区三区| 看片网站欧美日韩| 999亚洲国产精| 亚洲激情中文1区| 一区电影在线观看| 裸体一区二区| 国产毛片精品视频| 亚洲影音先锋| 亚洲高清激情| 欧美一区二区在线免费观看| 欧美成人一区二区| 亚洲国产精品一区二区www在线| 亚洲黄色三级| 久久日韩粉嫩一区二区三区| 久久久亚洲精品一区二区三区 | 久久在精品线影院精品国产| 欧美激情四色| 欧美亚洲视频| 嫩草国产精品入口| 欧美伊久线香蕉线新在线| 欧美一区国产一区| 亚洲一区二区三区视频| 午夜精品国产| 欧美在线黄色| 欧美日韩亚洲高清| 欧美激情第9页| 伊人久久综合97精品| 亚洲精品小视频| 亚洲国产精品第一区二区| 欧美三级乱人伦电影| 性欧美超级视频| 国产精品国产自产拍高清av王其| 欧美激情第二页| 亚洲精品久久嫩草网站秘色| 亚洲人成网站色ww在线| 激情一区二区| 久久中文欧美| 久久综合激情| 亚洲精品裸体| 欧美精品一区二区三区蜜桃| 亚洲欧美日韩国产中文| 欧美jjzz| 蜜臀va亚洲va欧美va天堂| 国产精品久久福利| 亚洲一区二区在线视频| 亚洲欧美日韩精品久久奇米色影视 | 欧美破处大片在线视频| 欧美中文在线视频| 在线观看日韩av电影| 久久久久www| 亚洲国产日韩欧美在线图片| 99re6热只有精品免费观看| 亚洲小视频在线观看| 欧美午夜精品理论片a级按摩| 亚洲色无码播放| 小黄鸭精品密入口导航| 欧美人与性禽动交情品 | 久久综合中文字幕| 亚洲二区在线视频| 国产精品久久久久毛片大屁完整版| 99视频精品在线| 欧美成人xxx|