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

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>
              亚洲麻豆av| 91久久久久久| 亚洲一区二区成人| 在线成人欧美| 亚洲国产99精品国自产| 韩日视频一区| 亚洲国产婷婷香蕉久久久久久99| 亚洲第一福利社区| 日韩视频二区| 羞羞视频在线观看欧美| 久久精品中文| 亚洲第一天堂无码专区| 亚洲二区在线视频| 亚洲一区二区伦理| 久久精品女人的天堂av| 欧美激情一区二区| 国产女主播在线一区二区| 激情丁香综合| 一区二区冒白浆视频| 亚洲欧洲av一区二区三区久久| 性欧美暴力猛交69hd| 蜜月aⅴ免费一区二区三区 | 久久理论片午夜琪琪电影网| 久久久久久久尹人综合网亚洲| 欧美成人精品在线观看| 日韩午夜免费视频| 久久国产加勒比精品无码| 欧美精品一区二区视频| 国产日韩在线看| 99国内精品| 久久天天躁狠狠躁夜夜av| 亚洲日本一区二区| 久久av一区二区三区漫画| 欧美破处大片在线视频| 国产一区二区激情| 亚洲视频专区在线| 欧美激情中文字幕在线| 欧美有码在线观看视频| 欧美日韩大片| 亚洲国产婷婷| 模特精品在线| 欧美在线观看一二区| 国产精品成人国产乱一区| 亚洲精品日日夜夜| 免费观看久久久4p| 欧美一区二区成人| 国产精品私拍pans大尺度在线| av不卡在线看| 亚洲国产精品美女| 老巨人导航500精品| 国产亚洲激情视频在线| 亚洲欧美日韩国产另类专区| 亚洲三级免费电影| 欧美**字幕| 亚洲黄色小视频| 欧美激情aⅴ一区二区三区| 欧美在线精品一区| 国产深夜精品| 久久精品成人一区二区三区蜜臀| 久久激情视频| aa成人免费视频| 欧美日韩亚洲高清一区二区| 亚洲麻豆av| 亚洲国产视频一区二区| 欧美成人精品| 99视频精品| 99re66热这里只有精品4| 欧美日韩国产不卡| 亚洲一区二区动漫| 亚洲欧美偷拍卡通变态| 国产在线不卡视频| 免费日韩精品中文字幕视频在线| 可以免费看不卡的av网站| 亚洲国产精品欧美一二99| 欧美国产第一页| 欧美电影免费观看网站| 最近看过的日韩成人| 亚洲精品少妇30p| 国产精品国产三级国产专区53| 午夜亚洲视频| 久久成人亚洲| 亚洲免费观看在线观看| 亚洲视频一二| 黑人一区二区三区四区五区| 欧美freesex8一10精品| 欧美激情一区二区三级高清视频| 亚洲午夜国产成人av电影男同| 亚洲已满18点击进入久久| 国内精品久久国产| 亚洲人成免费| 国产日韩精品在线观看| 欧美激情成人在线| 国产精品久久久久久久久久直播 | 亚洲一区二区三区四区五区午夜| 亚洲午夜伦理| 精品动漫3d一区二区三区免费版 | 另类av导航| 亚洲深夜影院| 久久国产精品电影| av成人老司机| 欧美一区二区三区四区高清| 亚洲经典视频在线观看| 亚洲一区二区三区四区五区午夜| 激情欧美丁香| 在线亚洲精品| 亚洲人午夜精品| 午夜亚洲伦理| 亚洲视频大全| 欧美风情在线| 麻豆成人综合网| 国产免费亚洲高清| 日韩视频一区二区三区在线播放免费观看 | 麻豆九一精品爱看视频在线观看免费| 欧美日韩免费一区二区三区| 欧美一区久久| 欧美精品国产精品日韩精品| 久久国产福利国产秒拍| 欧美噜噜久久久xxx| 久久影音先锋| 国产精品一区二区a| 亚洲免费观看高清完整版在线观看熊 | 欧美激情欧美激情在线五月| 国产精品高清在线观看| 91久久精品视频| 亚洲高清资源| 欧美一区久久| 久久精品国产99国产精品澳门| 欧美激情在线免费观看| 蜜桃av噜噜一区| 国产一区视频在线看| 亚洲亚洲精品在线观看| 中文国产一区| 欧美三级视频在线观看| 亚洲精品乱码久久久久久日本蜜臀| 极品尤物久久久av免费看| 午夜一区二区三区不卡视频| 性欧美xxxx视频在线观看| 欧美三区在线观看| 一本久久青青| 亚洲永久字幕| 国产精品人人做人人爽人人添| 一二三四社区欧美黄| 中文日韩电影网站| 欧美亚洲第一区| 午夜精品久久久99热福利| 欧美在线亚洲一区| 国模叶桐国产精品一区| 久久综合九色| 亚洲激情偷拍| 中文在线一区| 国产精品尤物| 午夜在线视频观看日韩17c| 久久av最新网址| 精品二区视频| 欧美精品午夜视频| 在线性视频日韩欧美| 欧美综合77777色婷婷| 黄色一区三区| 欧美成人蜜桃| 亚洲视频欧美视频| 久久久久久自在自线| 亚洲国产高清aⅴ视频| 欧美女同视频| 香蕉精品999视频一区二区| 免费亚洲视频| 亚洲午夜激情免费视频| 国产精品伊人日日| 久久久午夜精品| 日韩午夜激情av| 久久久久九九九| 日韩午夜高潮| 国产日本欧美一区二区三区| 久久久人成影片一区二区三区| 最新成人av网站| 欧美亚洲系列| 亚洲精品欧洲| 国产亚洲二区| 欧美日本乱大交xxxxx| 亚洲午夜一二三区视频| 在线观看亚洲一区| 国产精品大片免费观看| 久久精品国语| 亚洲淫片在线视频| 亚洲国产三级| 久久躁日日躁aaaaxxxx| 一本色道久久综合亚洲精品高清 | 美女被久久久| 亚洲视频第一页| 欧美国产视频在线观看| 午夜免费日韩视频| 99精品99久久久久久宅男| 国产专区欧美专区| 国产精品99免费看 | 亚洲免费av电影| 美女视频黄 久久| 欧美伊人久久久久久久久影院| 妖精成人www高清在线观看| 国内精品久久久久久| 国产精品日韩二区| 欧美日韩精品欧美日韩精品|