.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方向應用)