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

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>
              欧美国产亚洲精品久久久8v| 一区二区三区视频在线观看| 欧美在线视频全部完| 亚洲欧美激情视频在线观看一区二区三区 | 久久精品国内一区二区三区| 国产最新精品精品你懂的| 欧美专区在线观看| 久久一区二区三区av| 狠狠色狠色综合曰曰| 欧美高清在线视频观看不卡| 欧美a级理论片| 亚洲午夜精品福利| 久久久久久久一区二区三区| 日韩西西人体444www| 国产精品欧美经典| 久久久亚洲国产美女国产盗摄| 最新69国产成人精品视频免费| 久久成人在线| 亚洲精品日韩一| 午夜国产精品视频免费体验区| 一区视频在线看| 欧美午夜免费电影| 久久久国产午夜精品| 亚洲欧美伊人| 99re热这里只有精品免费视频| 久久久噜噜噜久噜久久| 性18欧美另类| 亚洲一区二区伦理| 亚洲高清不卡| 国产美女精品视频| 欧美性事在线| 国产揄拍国内精品对白| 亚洲精选视频在线| 亚洲国产精品久久久久秋霞影院 | 国产曰批免费观看久久久| 亚洲美女色禁图| 久久精品午夜| 亚洲少妇最新在线视频| 91久久精品日日躁夜夜躁国产| 亚洲无线观看| 欧美日韩卡一卡二| 欧美精品 日韩| 久久夜色精品国产欧美乱| 欧美亚洲免费| 久久精品国产一区二区三区| 欧美激情麻豆| 在线观看成人网| 亚洲国产欧美另类丝袜| 亚洲国产激情| 久久精品在线播放| 亚洲永久免费视频| 欧美在线观看视频| 国产精品理论片在线观看| 一区二区免费在线观看| 欧美日本亚洲| 欧美日韩在线免费| 欧美午夜精品| 久久综合九色欧美综合狠狠| 欧美制服丝袜第一页| 亚洲精品国精品久久99热| 亚洲视频欧洲视频| 韩国三级在线一区| 亚洲国产精品成人va在线观看| 亚洲国产mv| 久久综合色一综合色88| 国产精品天天看| 亚洲一区区二区| 久久一二三四| 国产欧美精品一区| 亚洲午夜精品在线| 欧美激情第五页| 亚洲福利国产| 亚洲日本成人网| 久久综合九色综合欧美就去吻| 欧美一区二视频| 欧美专区18| 久久久欧美精品sm网站| 国产午夜精品麻豆| 亚洲第一精品夜夜躁人人爽| 国产精品免费久久久久久| 99亚洲视频| 韩国一区二区在线观看| 午夜久久久久| 亚洲国产精品va在线看黑人 | 亚洲欧美另类中文字幕| 欧美人成网站| 一区二区国产在线观看| 另类天堂av| 亚洲精品看片| 国产一区二区中文字幕免费看| 亚洲免费视频一区二区| 亚洲福利免费| 欧美日韩一区二区三区| 亚洲欧美高清| 亚洲精品在线免费观看视频| 欧美一级久久| 亚洲精品在线视频观看| 欧美性大战久久久久| 老鸭窝毛片一区二区三区| 亚洲视频在线观看网站| 久久色中文字幕| 午夜精品视频| 一区二区三区国产精华| 亚洲激情在线播放| 国产视频久久| 国产精品你懂得| 欧美日韩精品一区二区天天拍小说| 欧美一区二区在线看| 亚洲人午夜精品免费| 噜噜噜在线观看免费视频日韩| 久久精品国产久精国产思思| 亚洲毛片av在线| 亚洲精品一区二区三区婷婷月| 一区二区三区在线视频播放 | 久久久久久久精| 亚洲一区二区三区激情| 中文在线一区| 亚洲一区二区三区视频播放| 日韩午夜免费| 一区二区三区日韩欧美精品| 亚洲女女女同性video| 亚洲精选大片| 午夜日韩视频| 久久久久久久欧美精品| 国产精品午夜在线| 国产精品免费网站在线观看| 国产精品久久久久国产精品日日 | 久久精品女人的天堂av| 久久精品视频免费观看| 美女主播一区| 9l国产精品久久久久麻豆| 国产亚洲精品久久飘花| 久久亚洲二区| 国产精品国产三级国产普通话三级 | 男人的天堂成人在线| 欧美美女视频| 狠狠爱成人网| 亚洲一二三四久久| 免费观看一区| 午夜视频在线观看一区二区三区 | 性做久久久久久久免费看| 欧美高清视频www夜色资源网| 欧美视频日韩| 一本色道久久综合亚洲精品高清 | 亚洲精品1234| 久久久www成人免费精品| 在线一区日本视频| 蜜臀久久久99精品久久久久久| 国产精品久久久久天堂| 99精品福利视频| 亚洲精品乱码久久久久久日本蜜臀 | 欧美gay视频| 永久91嫩草亚洲精品人人| 久久久久99| 久久九九99| 91久久精品日日躁夜夜躁欧美| 欧美一级理论片| 亚洲欧美一级二级三级| 国产日韩精品久久| 久久综合九色综合网站| 久久久人成影片一区二区三区观看 | 日韩午夜av电影| 国产精品青草久久| 久久人91精品久久久久久不卡 | 亚洲国产99| 欧美日韩大片| 欧美一区二区三区四区夜夜大片 | 欧美不卡视频一区| 免费在线日韩av| 美女诱惑一区| 亚洲自拍16p| 久久天天躁狠狠躁夜夜av| 亚洲日产国产精品| 亚洲欧美电影院| 一本一本a久久| 久久国产精品久久w女人spa| 亚洲大胆美女视频| 久久av老司机精品网站导航| 小黄鸭精品密入口导航| 亚洲黄色三级| 午夜精品久久久久久久99樱桃| 国内精品99| 久久精品国产一区二区电影| 亚洲丰满在线| 欧美一级片一区| 六月丁香综合| 在线日韩欧美| 久久久视频精品| 国产一区二区三区在线观看视频 | 在线观看视频免费一区二区三区 | 欧美ed2k| 亚洲韩国日本中文字幕| 亚洲精品偷拍| 欧美成人激情视频| 欧美va亚洲va日韩∨a综合色| 欧美怡红院视频| 欧美国内亚洲| 久久久av水蜜桃| 亚洲欧美日韩一区| 欧美美女喷水视频|