1. 程式人生 > >Unity3D C#中 String.Format的格式限定符

Unity3D C#中 String.Format的格式限定符

Format方法將多個物件格式化成一個字串Format方法解析格式字串的原理:

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

(2)、Format方法解析格式字串時,發現可替換引數0,則呼叫對應引數的IFormattable介面的ToString方法,如果格式化字串中的可替換引數0後面跟著格式限定符.則將格式限定符傳遞給ToString方法.沒有則傳遞預設的方法.

(3)、、Format方法解析格式字串時,發現可替換引數0,如果對應引數沒有繼承IFormattable介面,則呼叫該型別的ToString()方法,沒有則呼叫Object的ToString方法.

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

常見的格式有如下幾種:

  1. string strNeed = string.Format("{0}{1}",str1,str2);  //可以拼接成各種字串
  2. string strNeed = string.Format("{0:F2}", 2.3634f); // 可以使字串為保留兩位小數的浮點數值
  3. string strNeed = string.Format("{0:D2}",5);  // 可以使字作串為兩位整數的值,不足位數前面補零
  4. string strNeed = string.Format("0:3:X");   // 可以使字串為十六進位制的值

具體的如下:

1、C一格式化貨幣  

C6代表將數字轉換成當前執行緒國家的貨幣符號形式的大小並保留6位小數

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

2、D一將整形轉換成10進位制

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

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

3、N一用分號分隔數字,預設三位加一個分號

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

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

4、P一將數字轉成百分比,預設在百分比後面保留兩位小數

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

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

5、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);

6、#一數字佔位符

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

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

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

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

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

注:如果兩位小數,第一位為0,第二位小於4,那麼末尾的0會被捨棄

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

 

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

7、空格佔位符

將目標字串格式化成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就不說了

8、E或e一科學計數法

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

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

後面跟著的數字代表保留多少為的小數,預設保留兩位,這是NumberFormatInfo預設給定的精度.

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

10、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”。 

11、N或n一數字轉換標識,預設保留2位小數

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

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

12、R 或 r一往返過程

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

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

 13、X 或 x一十六進位制轉換

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

 14、日期格式符

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。一位數字的偏移量設定為帶前導零的格式。偏移量受夏時制影響。