.NETCore CSharp 中級篇2-5
本節(jié)內(nèi)容為常見實用類和方法的使用
String.Format
string.format方法是一個字符串格式化類,它里面的一些寫法是對字符串進行指定格式的轉(zhuǎn)換。
String.Format 方法的幾種定義:
* String.Format (String, Object) 將指定的 String 中的格式項替換為指定的 Object 實例的值的文本等效項。
* String.Format (String, Object[]) 將指定 String 中的格式項替換為指定數(shù)組中相應(yīng) Object
實例的值的文本等效項。
* String.Format (IFormatProvider, String, Object[]) 將指定 String
中的格式項替換為指定數(shù)組中相應(yīng) Object 實例的值的文本等效項。指定的參數(shù)提供區(qū)域性特定的格式設(shè)置信息。
* String.Format (String, Object, Object) 將指定的 String 中的格式項替換為兩個指定的 Object
實例的值的文本等效項。
* String.Format (String, Object, Object, Object) 將指定的 String 中的格式項替換為三個指定的
Object 實例的值的文本等效項。
看起來挺抽象的,事實上string.format的寫法有點類似于我們的正則表達式。我們著重的講一下幾個非常常用的用法。
數(shù)值格式化
字符 說明 示例 輸出
C 貨幣格式化,后接數(shù)字為小數(shù)點位數(shù) string.Format("{0:C3}", 2) 獲得當(dāng)前設(shè)置的貨幣格式,例如$2.000或¥2.000
D 十進制,后接數(shù)字為向前填充0至N位 string.Format("{0:D3}", 2) 002
X 輸出對應(yīng)的十六進制 string.Format("{0:X000}", 12) C
G 常規(guī)輸出 string.Format("{0:G}", 2) 2
N 用分號隔開的數(shù)字 string.Format("{0:N}", 250000) 250,000.00
自定義 自定義輸出 string.Format("{0:000.000}", 12.2) 012.200
值得注意的是,大括號括起來的是一個占位符,{0:}表示的是后接參數(shù)的第一個,{1:}則是第二個,作為一個占位符存在。
占位符
占位符分為以下兩種:
*
零占位符0:如果格式化的值在格式字符串中出現(xiàn)“0”的位置有一個數(shù)字,則此數(shù)字被復(fù)制到結(jié)果字符串中。小數(shù)點前最左邊的“0”的位置和小數(shù)點后最右邊的“0”的位置確定總在結(jié)果字符串中出現(xiàn)的數(shù)字范圍。
“00”說明符使得值被舍入到小數(shù)點前最近的數(shù)字,其中零位總被舍去。
*
數(shù)字占位符#:如果格式化的值在格式字符串中出現(xiàn)“#”的位置有一個數(shù)字,則此數(shù)字被復(fù)制到結(jié)果字符串中。否則,結(jié)果字符串中的此位置不存儲任何值。
請注意,如果“0”不是有效數(shù)字,此說明符永不顯示“0”字符,即使“0”是字符串中唯一的數(shù)字。如果“0”是所顯示的數(shù)字中的有效數(shù)字,則顯示“0”字符。
“##”格式字符串使得值被舍入到小數(shù)點前最近的數(shù)字,其中零總被舍去。
PS:空格占位符
string.Format("{0,-50}", theObj);//格式化成50個字符,原字符左對齊,不足則補空格
string.Format("{0,50}", theObj);//格式化成50個字符,原字符右對齊,不足則補空格
例如,用于固定區(qū)域性的自定義格式字符串為“dddd, dd MMMM yyyy”。
時間格式化
格式化時間非常簡單,我們通常描述時間都是年-月-日
時:分:秒就夠了,在String.Format類中,我們?nèi)∵@些描述詞的英文首字母作為格式化字符,例如1999-05-06我需要轉(zhuǎn)換成國外常見的時間表達方式05/06/99,我們只需要
"1999-05-06".Format("mm/dd/yy");
非常的簡單。我們列舉出一個表格詳細的闡明常用時間格式化的字符
字符 說明 詳情
d 短日期模式 表示由當(dāng)前 ShortDatePattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“MM/dd/yyyy”。
D 長日期模式 表示由當(dāng)前 LongDatePattern 屬性定義的自定義 DateTime 格式字符串。例如,“dddd, dd MMMM yyyy”。
f 完整日期/時間模式(短時間) 表示長日期 (D) 和短時間 (t) 模式的組合,由空格分隔。
F 完整日期/時間模式(長時間) 表示由當(dāng)前 FullDateTimePattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“dddd, dd MMMM yyyy HH:mm:ss”。
g 常規(guī)日期/時間模式(短時間) 表示短日期 (d) 和短時間 (t) 模式的組合,由空格分隔。
G 常規(guī)日期/時間模式(長時間) 表示短日期 (d) 和長時間 (T) 模式的組合,由空格分隔。
M 或 m 月日模式 表示由當(dāng)前 MonthDayPattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“MMMM dd”。
t 短時間模式 表示由當(dāng)前 ShortTimePattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“HH:mm”。
T 長時間模式 表示由當(dāng)前 LongTimePattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“HH:mm:ss”。
Y 或 y 年月模式 表示由當(dāng)前 YearMonthPattern 屬性定義的自定義 DateTime
格式字符串。例如,用于固定區(qū)域性的自定義格式字符串為“yyyy MMMM”。
還有一些自定義的方法,例如我之前舉的例子
字符 說明 詳情
N個d 將月中日期表示為從 1 至 31 的數(shù)字。 N個d則是在時間有效位小于N時在前面加0
N個M 將月表示為從 1 至 12 的數(shù)字。 N個d則是在時間有效位小于N時在前面加0
N個y 表示年 N個y則是在時間有效位小于N時在前面加0,特別的,1個y也是使用年份后兩位進行表示。
N個s 將秒表示為從 0 至 59 的數(shù)字。 秒表示自前一分鐘后經(jīng)過的整秒數(shù)
N個m 將分表示為從 0 至 59 的數(shù)字。 分鐘表示自前一小時后經(jīng)過的整分鐘數(shù)
N個h 將時表示為從 0 至 12 的數(shù)字。 自午夜或中午開始對整小時計數(shù)
N個H 將時表示為從 0 至 24 的數(shù)字。 自午夜或中午開始對整小時計數(shù)
枚舉格式字符串
字符 說明
G 或 g 如有可能,將枚舉項顯示為字符串值,否則顯示當(dāng)前實例的整數(shù)值。如果枚舉定義中設(shè)置了 Flags
屬性,則串聯(lián)每個有效項的字符串值并將各值用逗號分開。如果未設(shè)置 Flags 屬性,則將無效值顯示為數(shù)字項。
F 或 f 如有可能,將枚舉項顯示為字符串值。如果值可以完全顯示為枚舉項的總和(即使未提供 Flags
屬性),則串聯(lián)每個有效項的字符串值并將各值用逗號分開。如果值不能完全由枚舉項確定,則將值格式化為整數(shù)值。
D 或 d 以盡可能短的表示形式將枚舉項顯示為整數(shù)值。
X 或 x 將枚舉項顯示為十六進制值。按需要將值表示為帶有前導(dǎo)零,以確保值的長度最少有八位
DateTime
DateTime是C#時間處理的大殺器,它的效率非常高,顯著的優(yōu)于其他語言的時間處理,其中DateTime類型重寫了ToString()方法,在DateTime的ToString方法里面,我們可以輕而易舉的使用我們的格式化字符對它進行格式化。
事實上DateTime結(jié)構(gòu)并不是我們今天講的主題,因為DateTime的操作事實上就是我們的string.Format操作,至多我們講一下DateTime和字符串的轉(zhuǎn)換
符合時間格式的字符串轉(zhuǎn)換成DateTime結(jié)構(gòu)只需要使用
DateTime.Parse(str);
我們這節(jié)主要講解的是TimeSpan時間計算類的使用,不過在DateTime中也有部分函數(shù)用于時間計算,例如
* Add 將指定的TimeSpan的值加到此實例的值上。
* AddDays 將指定的天數(shù)加到此實例的值上。
* AddHours 將指定的小時數(shù)加到此實例的值上。
* AddMilliseconds 將指定的毫秒數(shù)加到此實例的值上。
* AddMinutes 將指定的分鐘數(shù)加到此實例的值上。
* AddMonths 將指定的月份數(shù)加到此實例的值上。
* AddSeconds 將指定的秒數(shù)加到此實例的值上。
* AddYears 將指定的年份數(shù)加到此實例的值上。
* Subtract 從此實例中減去指定的時間或持續(xù)時間。
TimeSpan
下面的列表闡明了部分TimeSpan的方法
* Add:與另一個TimeSpan值相加。
* Days:返回用天數(shù)計算的TimeSpan值。
* Hours:返回用小時計算的TimeSpan值
* Milliseconds:返回用毫秒計算的TimeSpan值。
* Minutes:返回用分鐘計算的TimeSpan值。
* Negate:返回當(dāng)前實例的相反數(shù)。
* Seconds:返回用秒計算的TimeSpan值。
* Subtract:從中減去另一個TimeSpan值。
* Ticks:返回TimeSpan值的tick數(shù)。
* TotalDays:返回TimeSpan值表示的天數(shù)。
* TotalHours:返回TimeSpan值表示的小時數(shù)。
* TotalMilliseconds:返回TimeSpan值表示的毫秒數(shù)。
* TotalMinutes:返回TimeSpan值表示的分鐘數(shù)。
* TotalSeconds:返回TimeSpan值表示的秒數(shù)。
StringBuilder
String對象是不可改變的,每次使用System.String類中的方法之一時,都要在內(nèi)存中創(chuàng)建一個新的字符串對象,這就需要為該新對象分配新的空間。如果你需要經(jīng)常操作字符串對象的話,直接使用string進行加減運算是很不劃算的做法,這個時候,我們需要使用我們的StringBuilder類進行操作。
StringBuilder可以自由擴展大小,因為StringBuilder分配在堆區(qū)。
并且StringBuilder可以指定其大小,當(dāng)指定分配大小之后,性能就會得到提升。在達到容量之前,它不會為其自己重新分配空間。如果超過指定大小系統(tǒng)會當(dāng)前大小倍增,也就10,15,20。建議指定大小。
常用的幾個方法
* StringBuilder.Append //將信息追加到當(dāng)前StringBuilder的結(jié)尾。
* StringBuilder.AppendFormat //用帶格式文本替換字符串中傳遞的格式說明符。
* StringBuilder.Insert //將字符串或?qū)ο蟛迦氲疆?dāng)前StringBuilder對象的指定索引處。
* StringBuilder.Remove //從當(dāng)前StringBuilder對象中移除指定數(shù)量的字符。
* StringBuilder.Replace //替換指定索引處的指定字符。
值得注意的一件事情是,對于C#,微軟對于String類型有著特殊的優(yōu)化,如果兩個字符串內(nèi)容相同,那么他們只會被創(chuàng)建一次,也就是說會指向同一塊內(nèi)存地址,并且,C#比較的方法有以下三種
* ==它是比較的棧里面的值是否相等(值比較)
* Equals它比較的是堆里面的值是否相等(引用地址值比較)
* Object.ReferenceEquals(obj1,obj2)它是比較的是內(nèi)存地址是否相等
示例:
StringBuilder MyStringBuilder = new StringBuilder("Hello World!",30);
MyStringBuilder.Insert(6,"test"); MyStringBuilder.Append("test");
你只需要記住,在面對大量字符串的操作處理中,我們使用StringBuilder來提高我們的運算速度。
如果我的文章幫助了您,請您在github.NETCoreGuide項目幫我點一個star,在博客園中點一個關(guān)注和推薦。
Github <https://github.com/StevenEco/.NetCoreGuide>
BiliBili主頁 <https://space.bilibili.com/33311288>
WarrenRyan'sBlog <https://blog.tity.xyz>
博客園 <https://cnblogs.com/warrenryan>
熱門工具 換一換