C# String.Format的格式限定符與Format方法將多個對象格式化一個字符串原理

Format方法將多個對象格式化成一個字符串Format方法解析格式字符串的原理:測試

(1)、格式字符串中的{0}會被替換成格式字符串以後的第一個參數,以此類推spa

(2)、Format方法解析格式字符串時,發現可替換參數0,則調用對應參數的IFormattable接口的ToString方法,若是格式化字符串中的可替換參數0後面跟着格式限定符.則將格式限定符傳遞給ToString方法.沒有則傳遞默認的方法.線程

(3)、、Format方法解析格式字符串時,發現可替換參數0,若是對應參數沒有繼承IFormattable接口,則調用該類型的ToString()方法,沒有則調用Object的ToString方法.3d

var str = string.Format("沒有繼承IFormattable接口的自定義類型:{0},繼承了IFormattable接口的自定義類型:{1}", new Program(),1);
            Console.WriteLine(str);

 

一、C一格式化貨幣  code

C6表明將數字轉換成當前線程國家的貨幣符號形式的大小並保留6位小數orm

var number = 100;
var outPut = $"{number:C6}";
Console.WriteLine(outPut);

 

二、D一將整形轉換成10進制對象

,D99表示將數字轉換成十進制,並以零填充保留99位blog

var number = 100;
var outPut = $"{number:D99}";
Console.WriteLine(outPut);

 

三、N一用分號分隔數字,默認三位加一個分號排序

N3表示將數字轉換成以分號分隔的數字,並保留3位小數繼承

var number = 1000000000;
var outPut = $"{number:N3}";
Console.WriteLine(outPut);

 

四、P一將數字轉成百分比,默認在百分比後面保留兩位小數

P0表示將數字轉換成百分比,並保留零位小數

var number = 1;
var outPut = $"{number:P0}";
Console.WriteLine(outPut);

 

五、0一零佔位符

00000表示先用0佔5個位子,若是要格式化的值在0的位置有一個數字,則此數字被複制到該0的位置處,若是格式化值得長度大於00000的長度,不會捨棄,原樣保存.若是小於則用0填充.

.00表示格式化的值的小數部分保留2位,若是第三位大於等於5,則4舍五入.若是小於兩位第二位用0填充,以此類推.

int number = 100;
var str = $"{number:00000}"; Console.WriteLine(str);

 int number = 1000000;
var str = $"{number:00000.00}"; Console.WriteLine(str);

 

六、#一數字佔位符

####表示給數字預留4個位子,將格式化的值複製到數字佔位符中.

注:這個過程格式化值整數部分的0總會被捨棄.

var number = 098804;
var str = $"{number:####}"; Console.WriteLine(str);

.#表示給小數部分留一個數字位,若是有兩位小數,第二位執行四捨五入操做.

var number = 098804.15;
var str = $"{number:####.#}"; Console.WriteLine(str);

注:若是兩位小數,第一位爲0,第二位小於4,那麼末尾的0會被捨棄

var number = 19884.049;
var str = $"{number:####.#}"; Console.WriteLine(str);

 

注:#佔位符開頭和末尾的0值老是會被捨棄,而0佔位符則不會.

 

七、空格佔位符

將目標字符串格式化成10個字符,原字符左對齊,不足補空格.

var number = "666";
var str = string.Format("{0,10}", number); Console.WriteLine("$"+str+"$");

一樣的效果用String的實例PadLeft方法也能夠實現

var number = "666";
var str = number.PadLeft(10); Console.WriteLine("$"+str+"$");

固然PadLeft支持填充自定義字符,空格佔位符只能用空格.

講完向左的空格佔位符,如今說向右的佔位符

var number = "666";
var str = string.Format("{0,-10}", number); Console.WriteLine("$"+str+"$");

PadRight就不說了

 

八、E或e一科學計數法

var number = 666;
var str = $"{number:e} {number:E}"; Console.WriteLine(str);

 

九、F或f一把目標值轉換成小數

後面跟着的數字表明保留多少爲的小數,默認保留兩位,這是NumberFormatInfo默認給定的精度.

var number = -6666.66;
var str = $"{number:f6} {number:F3}"; Console.WriteLine(str);

 

十、G或g一常規

根據數字類型以及是否存在精度說明符,數字會轉換爲定點或科學記數法的最緊湊形式。若是精度說明符被省略或爲零,則數字的類型決定默認精度,以下表所示。

Byte 或 SByte:3

Int16 或 UInt16:5

Int32 或 UInt32:10

Int64 或 UInt64:19

Single:7

Double:15

Decimal:29

若是用科學記數法表示數字時指數大於 -5 並且小於精度說明符,則使用定點表示法;不然使用科學記數法。若是要求有小數點,而且忽略尾部零,則結果包含小數點。若是精度說明符存在,而且結果的有效數字位數超過指定精度,則經過舍入刪除多餘的尾部數字。

上述規則有一個例外:若是數字是 Decimal 並且省略精度說明符時。在這種狀況下總使用定點表示法並保留尾部零。

使用科學記數法時,若是格式說明符是「G」,結果的指數帶前綴「E」;若是格式說明符是「g」,結果的指數帶前綴「e」。 

 

十一、N或n一數字轉換標識,默認保留2位小數

將目標整型轉換成數字類型,每3位用逗號分隔.

var number =-666;
var str = $"{number:N} {number:N6}"; Console.WriteLine(str);

 

十二、R 或 r一往返過程

只有 Single 和 Double 類型支持此格式。往返過程說明符保證轉換爲字符串的數值再次被分析爲相同的數值。使用此說明符格式化數值時,首先使用常規格式對其進行測試:Double 使用 15 位精度,Single 使用 7 位精度。若是此值被成功地分析回相同的數值,則使用常規格式說明符對其進行格式化。可是,若是此值未被成功地分析爲相同數值,則它這樣格式化:Double 使用 17 位精度,Single 使用 9 位精度。

雖然此處能夠存在精度說明符,但它將被忽略。使用此說明符時,往返過程優先於精度。 

 

 1三、X 或 x一十六進制轉換

精度說明符指示結果字符串中所需的最少數字個數。若是須要的話,則用零填充該數字的左側,以產生精度說明符給定的數字個數。 

 

 1四、日期格式符

var dateFlag = new String[] { "G", "d", "D", "g", "M", "m", "s", "T", "t", "u", "U" , "Y" , "r" , "R" , "o" , "O" , "F" , "f" };
var now = DateTime.Now; for (var i = 0; i < dateFlag.Length; i++) { var flag = dateFlag[i]; Console.WriteLine(flag+" 對應的日期生成規則的輸出是:{0}", now.ToString(flag)); } Console.ReadKey();

var now =DateTime.Now;
var str = $"{now:yyyy-MM-dd}"; Console.WriteLine(str);

M 或 m
月日模式
表示由當前 MonthDayPattern 屬性定義的自定義 DateTime 格式字符串。

例如,用於固定區域性的自定義格式字符串爲「MMMM dd」。

o
往返日期/時間模式
表示使用保留時區信息的模式的自定義 DateTime 格式字符串。該模式專用於往返 DateTime 格式(包括文本形式的 Kind 屬性)。隨後將 Parse 或 ParseExact 與正確的 Kind 屬性值一塊兒使用能夠對格式化的字符串進行反向分析。

自定義格式字符串爲「yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK」。

用於此說明符的模式是定義的標準。所以,不管所使用的區域性或所提供的格式提供程序是什麼,它老是相同的。

R 或 r
RFC1123 模式
表示由當前 RFC1123Pattern 屬性定義的自定義 DateTime 格式字符串。該模式是定義的標準,而且屬性是隻讀的。所以,不管所使用的區域性或所提供的格式提供程序是什麼,它老是相同的。

定義格式字符串爲「ddd, dd MMM yyyy HH':'mm':'ss 'GMT'」。

格式化不會修改正在格式化的 DateTime 對象的值。所以,應用程序在使用此格式說明符以前必須將該值轉換爲協調世界時 (UTC)。

s
可排序的日期/時間模式;符合 ISO 8601
表示由當前 SortableDateTimePattern 屬性定義的自定義 DateTime 格式字符串。此模式是定義的標準,而且屬性是隻讀的。所以,不管所使用的區域性或所提供的格式提供程序是什麼,它老是相同的。

自定義格式字符串爲「yyyy'-'MM'-'dd'T'HH':'mm':'ss」。

t
短期模式
表示由當前 ShortTimePattern 屬性定義的自定義 DateTime 格式字符串。

例如,用於固定區域性的自定義格式字符串爲「HH:mm」。

T
長時間模式
表示由當前 LongTimePattern 屬性定義的自定義 DateTime 格式字符串。

例如,用於固定區域性的自定義格式字符串爲「HH:mm:ss」。

u
通用的可排序日期/時間模式
表示由當前 UniversalSortableDateTimePattern 屬性定義的自定義 DateTime 格式字符串。此模式是定義的標準,而且屬性是隻讀的。所以,不管所使用的區域性或所提供的格式提供程序是什麼,它老是相同的。

自定義格式字符串爲「yyyy'-'MM'-'dd HH':'mm':'ss'Z'」。

格式化日期和時間時不進行時區轉換。所以,應用程序在使用此格式說明符以前必須將本地日期和時間轉換爲協調世界時 (UTC)。

U
通用的可排序日期/時間模式
表示由當前 FullDateTimePattern 屬性定義的自定義 DateTime 格式字符串。

此模式與完整日期/長時間 (F) 模式相同。可是,格式化將做用於等效於正在格式化的 DateTime 對象的協調世界時 (UTC)。

Y 或 y
年月模式
表示由當前 YearMonthPattern 屬性定義的自定義 DateTime 格式字符串。

例如,用於固定區域性的自定義格式字符串爲「yyyy MMMM」。

任何其餘單個字符
(未知說明符)
未知說明符將引起運行時格式異常。


自定義 DateTime 格式字符串

格式說明符 說明 
d
將月中日期表示爲從 1 至 31 的數字。一位數字的日期設置爲不帶前導零的格式。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

dd
將月中日期表示爲從 01 至 31 的數字。一位數字的日期設置爲帶前導零的格式。

ddd
將一週中某天的縮寫名稱表示爲當前 System.Globalization.DateTimeFormatInfo.AbbreviatedDayNames 屬性中定義的名稱。

dddd(另加任意數量的「d」說明符) 
將一週中某天的全名錶示爲當前 System.Globalization.DateTimeFormatInfo.DayNames 屬性中定義的名稱。

f
表示秒部分的最高有效位。

請注意,若是「f」格式說明符單獨使用,沒有其餘格式說明符,則該說明符被看做是「f」標準 DateTime 格式說明符(完整日期/時間模式)。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

將此格式說明符與 ParseExact 或 TryParseExact 方法一塊兒使用時,所用「f」格式說明符的數目指示要分析的秒部分的最高有效位位數。 

ff
表示秒部分的兩個最高有效位。

fff
表示秒部分的三個最高有效位。

ffff
表示秒部分的四個最高有效位。

fffff
表示秒部分的五個最高有效位。

ffffff
表示秒部分的六個最高有效位。

fffffff
表示秒部分的七個最高有效位。

F
表示秒部分的最高有效位。若是該位爲零,則不顯示任何信息。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

將此格式說明符與 ParseExact 或 TryParseExact 方法一塊兒使用時,所用「F」格式說明符的數目指示要分析的秒部分的最高有效位最大位數。

FF
表示秒部分的兩個最高有效位。但不顯示尾隨零(或兩個零位)。

FFF
表示秒部分的三個最高有效位。但不顯示尾隨零(或三個零位)。

FFFF
表示秒部分的四個最高有效位。但不顯示尾隨零(或四個零位)。

FFFFF
表示秒部分的五個最高有效位。但不顯示尾隨零(或五個零位)。

FFFFFF
表示秒部分的六個最高有效位。但不顯示尾隨零(或六個零位)。

FFFFFFF
表示秒部分的七個最高有效位。但不顯示尾隨零(或七個零位)。

g 或 gg(另加任意數量的「g」說明符) 
表示時期或紀元(例如 A.D.)。若是要設置格式的日期不具備關聯的時期或紀元字符串,則忽略該說明符。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

h
將小時表示爲從 1 至 12 的數字,即經過 12 小時製表示小時,自午夜或中午開始對整小時計數。所以,午夜後通過的某特定小時數與中午事後的相同小時數沒法加以區分。小時數不進行舍入,一位數字的小時數設置爲不帶前導零的格式。例如,給定時間爲 5:43,則此格式說明符顯示「5」。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

hh, hh(另加任意數量的「h」說明符) 
將小時表示爲從 01 至 12 的數字,即經過 12 小時製表示小時,自午夜或中午開始對整小時計數。所以,午夜後通過的某特定小時數與中午事後的相同小時數沒法加以區分。小時數不進行舍入,一位數字的小時數設置爲帶前導零的格式。例如,給定時間爲 5:43,則此格式說明符顯示「05」。

H
將小時表示爲從 0 至 23 的數字,即經過從零開始的 24 小時製表示小時,自午夜開始對小時計數。一位數字的小時數設置爲不帶前導零的格式。 

HH, HH(另加任意數量的「H」說明符) 
將小時表示爲從 00 至 23 的數字,即經過從零開始的 24 小時製表示小時,自午夜開始對小時計數。一位數字的小時數設置爲帶前導零的格式。 

K
表示 DateTime.Kind 屬性的不一樣值,即「Local」、「Utc」或「Unspecified」。此說明符以文本形式循環設置 Kind 值並保留時區。若是 Kind 值爲「Local」,則此說明符等效於「zzz」說明符,用於顯示本地時間偏移量,例如「-07:00」。對於「Utc」類型值,該說明符顯示字符「Z」以表示 UTC 日期。對於「Unspecified」類型值,該說明符等效於「」(無任何內容)。

m
將分鐘表示爲從 0 至 59 的數字。分鐘表示自前一小時後通過的整分鐘數。一位數字的分鐘數設置爲不帶前導零的格式。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

mm, mm(另加任意數量的「m」說明符) 
將分鐘表示爲從 00 至 59 的數字。分鐘表示自前一小時後通過的整分鐘數。一位數字的分鐘數設置爲帶前導零的格式。

M
將月份表示爲從 1 至 12 的數字。一位數字的月份設置爲不帶前導零的格式。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

MM
將月份表示爲從 01 至 12 的數字。一位數字的月份設置爲帶前導零的格式。

MMM
將月份的縮寫名稱表示爲當前 System.Globalization.DateTimeFormatInfo.AbbreviatedMonthNames 屬性中定義的名稱。

MMMM
將月份的全名錶示爲當前 System.Globalization.DateTimeFormatInfo.MonthNames 屬性中定義的名稱。

s
將秒錶示爲從 0 至 59 的數字。秒錶示自前一分鐘後通過的整秒數。一位數字的秒數設置爲不帶前導零的格式。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

ss, ss(另加任意數量的「s」說明符) 
將秒錶示爲從 00 至 59 的數字。秒錶示自前一分鐘後通過的整秒數。一位數字的秒數設置爲帶前導零的格式。

t
表示當前 System.Globalization.DateTimeFormatInfo.AMDesignator 或 System.Globalization.DateTimeFormatInfo.PMDesignator 屬性中定義的 A.M./P.M. 指示符的第一個字符。若是正在格式化的時間中的小時數小於 12,則使用 A.M. 指示符;不然使用 P.M. 指示符。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

tt, tt(另加任意數量的「t」說明符) 
將 A.M./P.M. 指示符表示爲當前 System.Globalization.DateTimeFormatInfo.AMDesignator 或 System.Globalization.DateTimeFormatInfo.PMDesignator 屬性中定義的內容。若是正在格式化的時間中的小時數小於 12,則使用 A.M. 指示符;不然使用 P.M. 指示符。

y
將年份表示爲最多兩位數字。若是年份多於兩位數,則結果中僅顯示兩位低位數。若是年份少於兩位數,則該數字設置爲不帶前導零的格式。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

yy
將年份表示爲兩位數字。若是年份多於兩位數,則結果中僅顯示兩位低位數。若是年份少於兩位數,則用前導零填充該數字使之達到兩位數。

yyy
將年份表示爲三位數字。若是年份多於三位數,則結果中僅顯示三位低位數。若是年份少於三位數,則用前導零填充該數字使之達到三位數。

請注意,對於年份能夠爲五位數的泰國佛曆,此格式說明符將顯示所有五位數。 

yyyy
將年份表示爲四位數字。若是年份多於四位數,則結果中僅顯示四位低位數。若是年份少於四位數,則用前導零填充該數字使之達到四位數。

請注意,對於年份能夠爲五位數的泰國佛曆,此格式說明符將呈現所有五位數。 

yyyyy(另加任意數量的「y」說明符)
將年份表示爲五位數字。若是年份多於五位數,則結果中僅顯示五位低位數。若是年份少於五位數,則用前導零填充該數字使之達到五位數。

若是存在額外的「y」說明符,則用所需個數的前導零填充該數字使之達到「y」說明符的數目。 

z
表示系統時間距格林威治時間 (GMT) 以小時爲單位測量的帶符號時區偏移量。例如,位於太平洋標準時區中的計算機的偏移量爲「-8」。

偏移量始終顯示爲帶有前導符號。加號 (+) 指示小時數早於 GMT,減號 (-) 指示小時數遲於 GMT。偏移量範圍爲 –12 至 +13。一位數字的偏移量設置爲不帶前導零的格式。偏移量受夏時制影響。有關使用單個格式說明符的更多信息,請參見使用單個自定義格式說明符。

zz
表示系統時間距格林威治時間 (GMT) 以小時爲單位測量的帶符號時區偏移量。例如,位於太平洋標準時區中的計算機的偏移量爲「-08」。

偏移量始終顯示爲帶有前導符號。加號 (+) 指示小時數早於 GMT,減號 (-) 指示小時數遲於 GMT。偏移量範圍爲 –12 至 +13。一位數字的偏移量設置爲帶前導零的格式。偏移量受夏時制影響。

zzz, zzz(另加任意數量的「z」說明符) 
表示系統時間距格林威治時間 (GMT) 以小時和分鐘爲單位測量的帶符號時區偏移量。例如,位於太平洋標準時區中的計算機的偏移量爲「-08:00」。

偏移量始終顯示爲帶有前導符號。加號 (+) 指示小時數早於 GMT,減號 (-) 指示小時數遲於 GMT。偏移量範圍爲 –12 至 +13。一位數字的偏移量設置爲帶前導零的格式。偏移量受夏時制影響。

相關文章
相關標籤/搜索