ToString是在開發(fā)中最常用的操作,其作用是將其它類型以字符串類型表示。例如:
int i=2;
i.ToString() //”2″
Object o = new Object();
o.ToString(); // 返回對(duì)象類型 System.Object
但是ToString也并非就這么簡(jiǎn)單。因?yàn)門oString實(shí)現(xiàn)自O(shè)bject類,而Object類是一切類的基類。其它的類繼承自O(shè)bject,自然也就實(shí)現(xiàn)了ToString方法。但是也可以重寫ToString方法。這也就衍生了其它的使用。如果我們運(yùn)用合理的話,將會(huì)使我們的開發(fā)非常的方便。例如在開發(fā)中常用到的:
一.格式化輸出,包含值類型,DateTime,GUID等,ToString()中接受參數(shù),根據(jù)參數(shù)輸出指定格式。
為實(shí)現(xiàn)格式化輸出,在相關(guān)的類型中,重寫ToString()為
public string ToString(string format) format 接收的參數(shù),按指定的格式輸出。接受參數(shù),如”C”,”D”,”E”,”等.
public string ToString(string format,IFormatProvider provider) format 接收的參數(shù),provider 為語(yǔ)言文化 如zh-CN 表示中文,en-US 表示美國(guó)英語(yǔ)
1.值類型,有時(shí)我們需要將值類型按照格式化輸出,如輸出為貨幣類型,我們只需要在ToString()中指定format為”C”,如果需要輸出美元符號(hào),可以將provider指定為en-US,例如
float f = 2000.12f;
f.ToString(“c”, CultureInfo.CreateSpecificCulture(“en-US”)); //輸出為$2,000.12
值類型中常用的參數(shù)有:
格式化參數(shù) | 說明 |
C | 貨幣符號(hào) |
D | 十進(jìn)制表示,后跟數(shù)字表占位符 如25.ToString(“D3”) ; =025 等價(jià)于 25.ToString(“000”); |
N | 易讀性數(shù)值表示法 ,用逗號(hào)分隔大型數(shù)值。如 123456.ToString(“N”); //123,456 |
P | 百分號(hào) |
X | 數(shù)值的16進(jìn)制表示,X后跟數(shù)字表示用幾位表示16進(jìn)制。如10.ToString(“X8”); //0000000A |
F | 指定小數(shù)點(diǎn)位置,四舍五入 |
E | 指數(shù)表示,后跟數(shù)字表示小數(shù)點(diǎn)位數(shù) |
G | 數(shù)值的一般表示格式,后跟數(shù)字為截取數(shù)值長(zhǎng)度 |
我們可以用代碼測(cè)試格式化參數(shù)的使用,如下所示:
string[] formatTypes = {"C","N","P","F2","E2","G4"}; double d = 1234.6789; foreach(string type in formatTypes) { Console.WriteLine(string.Format("{0}.ToString(\"{1}\")={2}",d,type,d.ToString(type))); }
測(cè)試輸出
2.DateTime,格式化參數(shù)主要用于日期時(shí)間的格式化輸出。DateTime.Now的默認(rèn)格式為G。參數(shù)有一部分區(qū)分大小寫。如下所示
使用的代碼
string[] dateTimeTypes = { "d", "D", "f", "F", "g", "G", "m","M", "o", "O", "R","r", "s", "t", "T", "u", "U", "y","Y" }; foreach(string type in dateTimeTypes) { Console.WriteLine(string.Format("{0}:{1}", type.PadLeft(2,' '),DateTime.Now.ToString(type, CultureInfo.CreateSpecificCulture("zh-CN")))); //設(shè)置中國(guó)的日期格式 }
測(cè)試輸出:
3.GUID,GUID為在開發(fā)過程中常用來代表唯一標(biāo)示。在GUID 類型中,格式化參數(shù)主要有:
string[] guidTypes={"N","D","B","P","X"}; foreach(string type in guidTypes) { Console.WriteLine(string.Format("{0}",Guid.NewGuid().ToString(type).PadLeft(2,' '))); }
輸出結(jié)果:
二.ToString的重寫,C#中的任何對(duì)象都繼承了ToString()方法。在自定義類中如果需要重寫ToString()方法,只需要在類中加入:
public override string ToString(){}
而支持格式化參數(shù)的ToString()需要繼承IFormattable接口,并實(shí)現(xiàn)
public string ToString(string format,IFormatProvider provider)方法
下面以People,Peoples類說明如何重寫ToString()。本例只是說明ToString()的用法,所以并沒有與數(shù)據(jù)庫(kù)交互。
class People { public People(string name,string address) { this.Name = name; this.Address = address; } public string Name { set; get; } public string Address { set; get; } } class Peoples:IEnumerable,IFormattable { private List<People> _peoples; private StringBuilder _sb; public Peoples() { _peoples = new List<People>(); } public void Add(People people) { _peoples.Add(people); } public IEnumerator GetEnumerator() { foreach(People p in _peoples) { yield return p; } } //重寫ToString() public override string ToString() { return GetContent(_peoples); } //重寫帶參ToString() public string ToString(string format) { return ToString(format, CultureInfo.CreateSpecificCulture("zh-CN")); } //重寫帶參ToString() public string ToString(string format, IFormatProvider provider) { IEnumerable<People> ps = _peoples; if (format.ToUpperInvariant() == "B") { ps = from p in _peoples where p.Address == "北京" select p; } else if (format.ToUpperInvariant() == "S") { ps = from p in _peoples where p.Address == "上海" select p; } return GetContent(ps); } private string GetContent(IEnumerable<People> peoples) { _sb = new StringBuilder(); foreach(People p in peoples) { _sb.AppendLine(string.Format("{0}:{1}", p.Name, p.Address)); } return _sb.ToString(); } } static void Main(string[] args) { Peoples peoples = new Peoples(){new People("zhangsan","北京"),new People("lisi","上海"),new People("wangwu","北京"),new People("naliu","北京")}; Console.WriteLine("本站會(huì)員有:"); Console.WriteLine(peoples.ToString()); Console.WriteLine("北京的會(huì)員有:"); Console.WriteLine(peoples.ToString("B")); Console.WriteLine("上海的會(huì)員有:"); Console.WriteLine(peoples.ToString("S")); Console.ReadLine(); }
輸出結(jié)果: