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

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

IFormattable,IFormatProvider,ICustomFormatter 接口的實(shí)現(xiàn)

.NET Framework提供了方法,能夠?qū)⑷魏螖?shù)值、枚舉以及日期和時(shí)間等基數(shù)據(jù)類型表示為字符串
格式化由格式說明符字符的字符串控制,該字符串指示如何表示基類型值
例如,格式說明符指示:是否應(yīng)該用科學(xué)記數(shù)法來表示格式化的數(shù)字
例如:格式字符"C",說明貨幣格式

同時(shí).NET Framework還使用區(qū)域性設(shè)置,以便用適合于特定區(qū)域性的形式表示基類型。
我們可以提供自定義的區(qū)域性設(shè)置,或者使用與當(dāng)前線程關(guān)聯(lián)的默認(rèn)區(qū)域性設(shè)置。
例如,格式化貨幣類型的時(shí)候,區(qū)域性設(shè)置指定用于貨幣符號(hào)

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

關(guān)于數(shù)字格式字符串,可以參考類
System.Globalization.NumberFormatInfo
關(guān)于日期與時(shí)間格式字符串,可以參考類
System.Globalization.DateTimeFormatInfo

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

一些基本的值類型實(shí)現(xiàn)了該接口,例如:
Int32 ,UInt32 , DateTime ,Guid ,類Enum

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

NumberFormatInfo、DateTimeFormatInfo和CultureInfo實(shí)現(xiàn)IFormatProvider接口

NumberFormatInfo提供數(shù)字格式信息,如用于小數(shù)分隔符和千位分隔符的字符,以及貨幣值中貨幣符號(hào)的拼寫和位置
DateTimeFormatInfo提供與日期相關(guān)和與時(shí)間相關(guān)的格式信息,如日期模式中月、日和年的位置
CultureInfo包含特定區(qū)域性中的默認(rèn)格式信息,其中包括數(shù)字格式信息以及與日期相關(guān)和與時(shí)間相關(guān)的格式信息

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


在arg為空引用時(shí),引發(fā)異常
如果 format 為空引用 ,將使用默認(rèn)格式規(guī)范
如果 formatProvider 為空引用 ,則忽略該參數(shù)

好了,說了這么多
我們來動(dòng)手來實(shí)現(xiàn)格式字符"MyFormat",在字符前加三個(gè)***的需求

定義一個(gè)類

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);
????????}

????}

}
再到一控制臺(tái)中
System.Globalization.CultureInfo?culture=null;

????????????MyClass?myClass
=new?MyClass(5);
????????????
//當(dāng)IFormatProvider為空時(shí),調(diào)用的是當(dāng)前線程關(guān)聯(lián)的文化信息
????????????Console.WriteLine("顯示中國(guó)貨幣格式:{0}",myClass.ToString("C",null));

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

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

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

效果如下:


如果希望自定義格式化能在多個(gè)不同類使用,那么實(shí)現(xiàn)我們應(yīng)該實(shí)現(xiàn)ICustomFormatter接口

定義一個(gè)類

using?System;

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


????????
//實(shí)現(xiàn)Format方法說明:
????????
//如果您的格式方法不支持格式,則確定正在設(shè)置格式的對(duì)象是否實(shí)現(xiàn)?IFormattable?接口。
????????
//如果實(shí)現(xiàn),請(qǐng)調(diào)用該接口的IFormattable.ToString?方法。
????????
//否則,調(diào)用基礎(chǔ)對(duì)象的默認(rèn)?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();
????????????????}

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

????????}

????}

}

到一控制臺(tái)中
????????????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();

效果如下:


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



希望上面提到的知識(shí)對(duì)你有所提示
當(dāng)然歡迎交流和指正

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

寫隨筆費(fèi)時(shí)又費(fèi)力,請(qǐng)尊重作者的權(quán)利
謝謝!
namespace?Microshaoft
{
????
using?System;

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

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


????????
//實(shí)現(xiàn)Format方法說明:?
????????
//如果您的格式方法不支持格式,則確定正在設(shè)置格式的對(duì)象是否實(shí)現(xiàn)?IFormattable?接口。?
????????
//如果實(shí)現(xiàn),請(qǐng)調(diào)用該接口的IFormattable.ToString?方法。?
????????
//否則,調(diào)用基礎(chǔ)對(duì)象的默認(rèn)?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[]?{"",?"",?"",?"",?"",?"",?"",?"",?"",?""};
????????????????????
//位?數(shù)組?
????????????????????string[]?Digits?=?new?string[]?{"",?"",?"",?""};
????????????????????
//單位?數(shù)組?
????????????????????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;?//取模?

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

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

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

????????????????
//?內(nèi)層循環(huán)在該組中的每一位數(shù)上循環(huán)?從左到右?高位到低位?
????????????????for?(int?j?=?0;?j?<?l;?j++)
????????????????
{
????????????????????
//處理改組中的每一位數(shù)加上所在位:?"仟","佰","拾",""(個(gè))?
????????????????????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;
????????????????
//?每組最后加上一個(gè)單位:?[萬],[億]?等?
????????????????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原創(chuàng)技術(shù)隨筆(.Net方向應(yīng)用)

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

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811980
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲电影观看| 国产精品美女久久久久久2018| 国产精品一二一区| 欧美亚洲一区| 久久久天天操| 99精品国产热久久91蜜凸| 亚洲欧洲三级| 国产精品av久久久久久麻豆网| 欧美亚洲视频一区二区| 欧美一区二区三区的| 亚洲高清三级视频| 亚洲六月丁香色婷婷综合久久| 国产精品成人在线观看| 久久亚洲精品一区二区| 中文一区在线| 午夜电影亚洲| 亚洲欧洲一区| 亚洲永久免费精品| 亚洲电影欧美电影有声小说| 亚洲激情偷拍| 韩国精品一区二区三区| 好看的亚洲午夜视频在线| 亚洲国产精品黑人久久久| 亚洲精选在线| 国外成人免费视频| 亚洲黄网站在线观看| 国产精品网站视频| 亚洲国产精品美女| 国产精品一区二区久久久久| 欧美激情在线狂野欧美精品| 国产精品婷婷| 亚洲精品1234| 亚洲高清一二三区| 亚洲一区二区在线看| 亚洲欧洲精品一区二区| 欧美影院视频| 午夜精品一区二区三区电影天堂| 久久综合一区| 久久九九免费视频| 欧美国产日产韩国视频| 国产精品美女久久久| 亚洲人妖在线| 亚洲国产日韩一级| 欧美一区二区精美| 先锋影院在线亚洲| 欧美三级在线| 亚洲精品日韩激情在线电影| 今天的高清视频免费播放成人| 在线亚洲一区二区| 国产精品99久久99久久久二8| 免费在线观看精品| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久电影一区| 欧美午夜女人视频在线| 亚洲国产精品一区在线观看不卡| 激情欧美一区二区| 久久精品理论片| 久久精品日产第一区二区| 国产欧美日韩免费看aⅴ视频| 宅男噜噜噜66一区二区| 亚洲网友自拍| 国产精品久久国产精品99gif| 日韩午夜av| 亚洲欧美国产另类| 国产精品初高中精品久久| 一本久道综合久久精品| 亚洲网站在线播放| 国产精品porn| 亚洲欧美中文日韩在线| 性感少妇一区| 含羞草久久爱69一区| 久久精品一本| 亚洲大胆在线| 一本色道久久综合精品竹菊 | 91久久精品国产91久久性色tv| 久久久久久久久综合| 美女爽到呻吟久久久久| 在线不卡亚洲| 欧美女同在线视频| 亚洲一区二区三区777| 欧美专区日韩专区| 亚洲第一区在线| 欧美精品少妇一区二区三区| 极品日韩久久| 欧美午夜电影网| 亚洲精品国产精品乱码不99| 一区二区激情小说| 国产精品网站在线| 久久久久久久一区| 亚洲人体大胆视频| 久久国产精品亚洲77777| 伊人久久大香线蕉综合热线| 欧美精品久久久久久久免费观看 | 久久久精品五月天| 国产在线欧美| 欧美精品网站| 小黄鸭精品aⅴ导航网站入口| 欧美xart系列高清| 亚洲综合日韩| 亚洲国产毛片完整版| 欧美视频亚洲视频| 久久久爽爽爽美女图片| 99精品视频一区| 美日韩在线观看| 亚洲欧美另类中文字幕| 亚洲国产高清高潮精品美女| 欧美午夜不卡在线观看免费 | 中日韩午夜理伦电影免费| 国产欧美精品日韩| 欧美精品v日韩精品v韩国精品v| 午夜伦理片一区| 亚洲精品男同| 欧美成人久久| 久久精品亚洲一区二区| 在线一区二区日韩| 91久久夜色精品国产网站| 国产欧美日韩亚洲一区二区三区| 欧美高清视频一二三区| 久久国产精品色婷婷| 亚洲视频福利| 日韩视频在线免费| 亚洲高清毛片| 免费在线观看一区二区| 欧美一区二区三区四区在线观看地址| 亚洲精品久久久久久久久久久| 一区二区三区视频观看| 欧美激情精品| 欧美.www| 猛男gaygay欧美视频| 久久精品99国产精品| 午夜精品理论片| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲精品一区二区三区在线观看 | 免费久久99精品国产自| 欧美在线视频在线播放完整版免费观看 | 免费日韩一区二区| 久久香蕉国产线看观看网| 午夜国产一区| 欧美日韩亚洲国产一区| 久久国产福利| 亚洲免费综合| 亚洲综合色噜噜狠狠| 亚洲天堂视频在线观看| 一区二区三区回区在观看免费视频| 亚洲日本中文字幕| 亚洲肉体裸体xxxx137| 亚洲人屁股眼子交8| 亚洲国产视频一区二区| 亚洲国产婷婷综合在线精品| 最新日韩欧美| 一本色道久久88综合亚洲精品ⅰ| 一区二区三区视频在线播放| 在线视频日韩| 亚洲欧美色一区| 久久成人精品电影| 久久综合伊人77777蜜臀| 免费日韩成人| 亚洲精品在线视频| 亚洲字幕一区二区| 久久精品官网| 欧美激情国产精品| 国产精品免费福利| 国语精品中文字幕| 亚洲人精品午夜在线观看| 一区二区三区欧美在线| 性色av一区二区三区| 久久久夜精品| 亚洲国产精品热久久| 日韩亚洲成人av在线| 亚洲欧美综合精品久久成人| 久热这里只精品99re8久| 欧美日韩和欧美的一区二区| 国产精品一卡| 亚洲国产成人在线| 亚洲专区一二三| 麻豆精品在线播放| 99热这里只有成人精品国产| 欧美一区二区成人| 欧美激情视频网站| 国产性做久久久久久| 亚洲精品国产精品国自产观看浪潮 | 亚洲高清在线| 亚洲桃色在线一区| 免费视频久久| 欧美亚洲综合网| 欧美区高清在线| 国内精品久久久久影院优| 一区二区三区成人| 玖玖玖免费嫩草在线影院一区| 亚洲巨乳在线| 免费成人av在线| 国产日韩精品一区二区三区在线 | 亚洲欧美日韩综合一区| 亚洲高清视频的网址| 欧美一区二区视频在线| 欧美视频一区二区三区四区| 91久久国产综合久久| 久久久五月婷婷| 亚洲欧美日韩国产| 欧美日韩一区二区精品|