本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

String.Format 方法

 

根據指定的格式將物件的值轉換為字串,並將它們插入到另一個字串。

如果您是新手String.Format方法,請參閱String.Format 方法入門一節以取得快速概觀。

請參閱備註的完整文件的所有區段String.Format多載。

命名空間:   System
組件:  mscorlib (於 mscorlib.dll)

名稱描述
System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object)

以對應物件的字串表示,取代指定之字串中的一或多個格式項目。 參數提供特定文化特性格式資訊。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object, Object)

以兩個指定之物件的字串表示,取代指定之字串中的格式項目。 參數提供特定文化特性格式資訊。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object, Object, Object)

以三個指定之物件的字串表示,取代指定之字串中的格式項目。 參數提供特定文化特性格式資訊。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object[])

以指定陣列中對應物件的字串表示,取代指定之字串中的格式項目。 參數提供特定文化特性格式資訊。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object)

以指定之物件的字串表示,取代指定之字串中的一或多個格式項目。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object, Object)

以兩個指定之物件的字串表示,取代指定之字串中的格式項目。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object, Object, Object)

以三個指定之物件的字串表示,取代指定之字串中的格式項目。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object[])

以指定陣列中對應物件的字串表示,取代指定之字串中的格式項目。

使用String.Format如果您要插入到另一個字串的物件、 變數或運算式的值。 例如,您可以在其中插入的值Decimal顯示給使用者以單一字串的字串值︰

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
// Result: The current price is 17.36 per ounce.

而且,您可以控制該數值的格式︰

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0:C2} per ounce.",
                         pricePerOunce);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.

除了格式,您也可以控制對齊和間距。

將字串插入

String.Format開始使用的格式字串,後面接著一個或多個物件會轉換成字串並插入格式字串中的指定位置的運算式。 例如:

decimal temp = 20.4m;
string s = String.Format("The temperature is {0}°C.", temp);
Console.WriteLine(s);
// Displays 'The temperature is 20.4°C.'

{0}格式字串是格式項目。 0這是的物件的字串值將會插入該位置的索引。 (索引 0 開始。) 如果要插入的物件不是字串,其ToString呼叫方法,將它轉換成插入結果字串中之前的其中一個。

以下是使用 [物件] 清單中的兩個格式項目和兩個物件的另一個範例︰

string s = String.Format("At {0}, the temperature is {1}°C.",
                         DateTime.Now, 20.4);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'

您可以擁有最多的格式項目,而且想為您的 [物件] 清單中的許多物件,只要每個格式項目的索引物件清單中有相符的物件。 您也不必擔心相關的多載呼叫。編譯器會選擇適合您。

控制格式設定

您可以遵循格式字串來控制如何格式化物件的格式項目中的索引。 例如, {0:d} "d"格式字串適用於物件清單中的第一個物件。 以下是以單一物件的範例和兩個格式項目︰

string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'

類型支援的數字格式字串,包括所有數字類型 (兩者標準自訂格式字串),所有日期和時間 (同時標準自訂格式字串) 和時間間隔 (兩者標準自訂格式字串),所有列舉型別列舉型別,和GUIDs 您也可以將格式字串的支援加入自己的型別中。

控制間距

您可以定義使用像是語法插入結果字串之字串的寬度{0,12},其中插入 12 個字元的字串。 在此情況下,第一個物件的字串表示處於靠右對齊 12 個字元的欄位。 (如果第一個物件的字串表示的長度超過 12 個字元,不過,會略過慣用的欄位寬度,且整個字串插入結果字串。)

下列範例會定義 6 個字元的欄位,來容納字串 「 年 」 和某些年字串,以及 15 個字元的欄位來容納字串 「 母體擴展 」 以及一些母體擴展的資料。 請注意,字元靠右對齊欄位中。

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,6} {1,15}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,6} {1,15:N0}\n",
                      years[index], population[index]);
// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
控制對齊方式

根據預設,字串才靠右對齊,其欄位中指定欄位寬度。 若要靠左對齊欄位中的字串,您前面上欄位寬度,以負號,例如{0,-12}定義 12 個字元,靠右對齊的欄位。

下列範例是類似於上一個,,不同之處在於它靠左對齊的標籤和資料。

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203

String.Format使用複合格式功能。 如需詳細資訊,請參閱複合格式

如需有關選擇最多載的其他指引,請參閱沒有呼叫的方法?

String String.Format(String format, Object arg0)

取代指定之物件的字串表示的格式項目 (範例)。

String String.Format(String format, Object arg0, Object arg1)

兩個指定之物件的字串表示,取代的格式項目 (範例)。

String String.Format(String format, Object arg0, Object arg1, Object arg2)

三個指定之物件的字串表示,取代的格式項目 (範例)。

String String.Format(String format, params Object[] args)

指定陣列中對應物件的字串表示,取代格式項目 (範例)。

String String.Format(IFormatProvider provider, String format, params Object[] args)

中指定的陣列,對應物件字串表示,取代的格式項目,並使用指定的文化特性格式資訊 (範例) 或自訂格式設定資訊 (範例)。

這是完整的參數清單Format方法; 每個多載所使用的參數上的多載語法,請參閱。 只有format參數由所有多載。

參數

類型

描述

format

String

複合格式字串,其中包含一或多個格式項目 (請參閱格式項目)。

arg0

String

第一個或僅要格式化的物件。

arg1

String

要格式化的第二個物件。

arg2

String

要格式化的第三個物件。

args

String[]

若要格式化,零或多個物件提供以逗號分隔的清單或陣列。

provider

IFormatProvider

物件,提供自訂或特定文化特性格式資訊。

類型︰ String
一份format在其中的格式項目皆已被取代的對應引數的字串表示。

例外狀況

條件

所擲回

ArgumentNullException

formatnull

所有多載。

FormatException

format 無效。

-或-

格式項目的索引小於零,或大於或等於引數清單中的引數。

所有多載。

呼叫

使用目前文化特性的慣例來格式化一個或多個物件。

除了包含多載provider參數,其餘Format多載包括String參數後面接著一個或多個物件參數。 因為這個緣故,您不需要判斷哪一個Format您想要呼叫的多載。 您的語言編譯器將會選取從沒有多載中的適當多載provider根據引數清單的參數。 例如,如果引數清單有五個引數,編譯器會呼叫Format(String, Object[])方法。

使用特定文化特性的慣例來格式化一個或多個物件。

每個Format開頭的多載provider參數後面String參數和一個或多個物件的參數。 因為這個緣故,您不必判斷哪一個特定Format您想要呼叫的多載。 您的語言編譯器將會選取適當的多載具有多載,從provider根據引數清單的參數。 例如,如果引數清單有五個引數,編譯器會呼叫Format(IFormatProvider, String, Object[])方法。

不論是透過執行自訂格式化作業ICustomFormatter實作或IFormattable實作。

任何具有四個多載provider參數。 編譯器將會選取適當的多載,從具有的多載provider參數,根據引數清單。

每個多載Format方法會使用複合格式功能以包含以零為起始的索引的位置,格式項目,呼叫複合格式字串中。 在執行階段,每個格式項目會取代對應的引數在參數清單中的字串表示。 如果引數的值為null,格式項目取代String.Empty 例如,下列呼叫Format(String, Object, Object, Object)方法包括三個格式項目、 與 {0}、 {1},{2},格式字串和引數清單具有三個項目。

DateTime dat = new DateTime(2012, 1, 17, 9, 30, 0); 
string city = "Chicago";
int temp = -16;
string output = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                              dat, city, temp);
Console.WriteLine(output);
// The example displays the following output:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.   

格式項目具有下列語法︰


{
index[,alignment][ :formatString] }

方括號表示選擇性的項目。 需要左和右大括號。 (包含常值的左或右大括弧在格式字串中,請參閱 「 逸出大括號 」 一節複合格式文件。)

例如,格式貨幣值,可能會將格式項目會出現如下︰

String.Format("{0,-10:C}", 126347.89m);         

格式項目具有下列項目︰

索引

以零為起始的索引為其字串表示的引數包含在這個字串中的位置。 如果這個引數是null,空字串會包含在這個字串中的位置。

對齊

選擇項。 帶正負號的整數,指出欄位的總長度成插入引數,它會靠右對齊 (正整數),或靠左對齊 (負整數)。 如果您省略對齊,對應的引數的字串表示插入任何開頭或尾端空格的欄位中。

如果值對齊插入,引數的長度小於對齊會忽略和引數的字串表示的長度當做欄位寬度。

formatString

選擇項。 字串,指定對應引數的結果字串的格式。 如果您省略formatString,對應的引數的無參數ToString呼叫方法來產生它的字串表示。 如果您指定formatString,格式項目所參考的引數必須實作IFormattable介面。 支援格式字串的類型包括︰

不過,請注意,任何自訂的類型可以實作IFormattable擴充現有的類型或IFormattable實作。

下列範例會使用alignmentformatString產生格式化的引數。

using System;

public class Example
{
   public static void Main()
   {
      // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Tuple<string, DateTime, int, DateTime, int>[] cities = 
          { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                         new DateTime(1950, 1, 1), 1970358),
            Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                         new DateTime(1950, 1, 1), 7891957),  
            Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                         new DateTime(1950, 1, 1), 3620962),  
            Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                         new DateTime(1950, 1, 1), 1849568) };

      // Display header
      string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                    "City", "Year", "Population", "Change (%)");
      Console.WriteLine(header);
      string output;      
      foreach (var city in cities) {
         output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/ (double)city.Item3);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//    
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %

格式項目會依序處理,從字串的開頭。 每個格式項目有對應至方法的引數清單中的物件索引。 Format方法擷取的引數,並衍生其字串表示,如下所示︰

如需範例,會呼叫攔截ICustomFormatter.Format方法,可讓您查看哪些資訊Format方法傳遞至格式化的方法,以便在複合格式字串中,每個格式項目請參閱範例 7: 截距,提供者和羅馬數字格式器

Format方法會擲回FormatException索引項目的索引是否大於或等於引數清單中的引數的例外狀況。 不過,format可以包含多個格式項目比引數,只要多個格式項目具有相同的索引。 在呼叫Format(String, Object)在下列範例中,引數清單的方法具有單一引數,但是格式字串包含兩個格式項目︰ 一個顯示數字的十進位值與另一個則顯示十六進位值。

public class Example
{
   public static void Main()
   {
      short[] values= { Int16.MinValue, -27, 0, 1042, Int16.MaxValue };
      Console.WriteLine("{0,10}  {1,10}\n", "Decimal", "Hex");
      foreach (short value in values)
      {
         string formatString = String.Format("{0,10:G}: {0,10:X}", value);
         Console.WriteLine(formatString);
      }   
   }
}
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF

一般而言,引數清單中的物件會轉換成其字串表示法傳回使用目前的文化特性的慣例CultureInfo.CurrentCulture屬性。 您可以透過呼叫其中一個多載來控制此行為Format包含provider參數。 provider參數是IFormatProvider處理實作,提供自訂和特定文化特性格式資訊用來進行中等程度的格式。

IFormatProvider介面具有單一成員, GetFormat,這是負責傳回的物件,提供格式設定資訊。 .NET Framework 有三個IFormatProvider實作,以提供特定文化特性的格式︰

您也可以呼叫的多載任一Format方法具有provider參數Format(IFormatProvider, String, Object[])執行自訂的格式設定作業的多載。 例如,您無法格式化整數當做識別碼或電話號碼。 若要執行自訂的格式,您provider引數必須同時實作IFormatProviderICustomFormatter介面。Format方法傳遞ICustomFormatter實作做為provider引數,Format方法會呼叫其IFormatProvider.GetFormat實作要求類型的物件和ICustomFormatter 然後它會呼叫傳回ICustomFormatter物件的Format方法來格式化複合字串中的每個格式項目傳遞給它。

如需提供自訂格式解決方案的詳細資訊,請參閱如何:定義和使用自訂數值格式提供者ICustomFormatter 如需將整數轉換為格式化自訂的數字的範例,請參閱範例 6︰ 自訂格式化作業 如需將不帶正負號的位元組轉換為羅馬數字的範例,請參閱範例 7: 截距,提供者和羅馬數字格式器

下列範例會使用Format(String, Object)內嵌字串中間的個人的年齡的方法。

using System;

[assembly: CLSCompliant(true)]
public class Example
{
   public static void Main()
   {
      DateTime birthdate = new DateTime(1993, 7, 28);
      DateTime[] dates = { new DateTime(1993, 8, 16), 
                           new DateTime(1994, 7, 28), 
                           new DateTime(2000, 10, 16), 
                           new DateTime(2003, 7, 27), 
                           new DateTime(2007, 5, 27) };

      foreach (DateTime dateValue in dates)
      {
         TimeSpan interval = dateValue - birthdate;
         // Get the approximate number of years, without accounting for leap years.
         int years = ((int) interval.TotalDays) / 365;
         // See if adding the number of years exceeds dateValue.
         string output;
         if (birthdate.AddYears(years) <= dateValue) {
            output = String.Format("You are now {0} years old.", years);
            Console.WriteLine(output);
         }   
         else {
            output = String.Format("You are now {0} years old.", years - 1);
            Console.WriteLine(output);
         }      
      }
   }
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.

這個範例會使用Format(String, Object, Object)方法,以顯示儲存在一般時間和溫度資料Dictionary<TKey, TValue>物件。 請注意在格式字串有三個格式項目,雖然只有兩個要格式化的物件。 這是因為清單 (日期和時間值) 中的第一個物件由兩個格式項目︰ 第一個格式項目顯示,並且第二個顯示的日期。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Dictionary<DateTime, Double> temperatureInfo = new Dictionary<DateTime, Double>(); 
      temperatureInfo.Add(new DateTime(2010, 6, 1, 14, 0, 0), 87.46);
      temperatureInfo.Add(new DateTime(2010, 12, 1, 10, 0, 0), 36.81);

      Console.WriteLine("Temperature Information:\n");
      string output;   
      foreach (var item in temperatureInfo)
      {
         output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", 
                                item.Key, item.Value);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5°F
//       Temperature at 10:00 AM on 12/1/2010:  36.8°F

這個範例會使用Format(String, Object, Object, Object)方法來建立字串,其中說明的布林值結果And具有兩個整數值的作業。 請注意,格式字串包含六個格式項目,但是方法只有三個項目在其參數清單中,因為每個項目會以兩個不同的方式格式化。

using System;

public class Example
{
   public static void Main()
   {
      string formatString = "    {0,10} ({0,8:X8})\n" + 
                            "And {1,10} ({1,8:X8})\n" + 
                            "  = {2,10} ({2,8:X8})";
      int value1 = 16932;
      int value2 = 15421;
      string result = String.Format(formatString, 
                                    value1, value2, value1 & value2);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)

這個範例會建立字串,包含在特定日期的高低溫度資料。 複合格式字串有五個格式項目,在 C# 範例和六個 in Visual Basic 範例。 兩個格式項目定義及其對應值的字串表示,寬度,並將第一個格式項目也會包含標準日期和時間格式字串。

using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 7, 1);
      TimeSpan hiTime = new TimeSpan(14, 17, 32);
      decimal hiTemp = 62.1m; 
      TimeSpan loTime = new TimeSpan(3, 16, 10);
      decimal loTemp = 54.8m; 

      string result1 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     date1, hiTime, hiTemp, loTime, loTemp);
      Console.WriteLine(result1);
      Console.WriteLine();

      string result2 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     new object[] { date1, hiTime, hiTemp, loTime, loTemp });
      Console.WriteLine(result2);
   }
}
// The example displays the following output:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)

您也可以傳遞要格式化為陣列的物件而非引數清單。

using System;

public class CityInfo
{
   public CityInfo(String name, int population, Decimal area, int year)
   {
      this.Name = name;
      this.Population = population;
      this.Area = area;
      this.Year = year;
   }

   public readonly String Name; 
   public readonly int Population;
   public readonly Decimal Area;
   public readonly int Year;
}

public class Example
{
   public static void Main()
   {
      CityInfo nyc2010 = new CityInfo("New York", 8175133, 302.64m, 2010);
      ShowPopulationData(nyc2010);
      CityInfo sea2010 = new CityInfo("Seattle", 608660, 83.94m, 2010);      
      ShowPopulationData(sea2010); 
   }

   private static void ShowPopulationData(CityInfo city)
   {
      object[] args = { city.Name, city.Year, city.Population, city.Area };
      String result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console.WriteLine(result); 
   }
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet

這個範例會使用Format(IFormatProvider, String, Object[])方法,以顯示一些日期和時間值和數值的字串表示,使用數個不同的文化特性。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "de-DE", "es-ES" };

      DateTime dateToDisplay = new DateTime(2009, 9, 1, 18, 32, 0);
      double value = 9164.32;

      Console.WriteLine("Culture     Date                                Value\n");
      foreach (string cultureName in cultureNames)
      {
         CultureInfo culture = new CultureInfo(cultureName);
         string output = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", 
                                       culture.Name, dateToDisplay, value);
         Console.WriteLine(output);
      }    
   }
}
// The example displays the following output:
//    Culture     Date                                Value
//    
//    en-US       Tuesday, September 01, 2009         9,164.32
//    fr-FR       mardi 1 septembre 2009              9 164,32
//    de-DE       Dienstag, 1. September 2009         9.164,32
//    es-ES       martes, 01 de septiembre de 2009    9.164,32

這個範例會定義整數值格式化為客戶帳戶編號中表單 x-xxxxx-xx 的格式提供者。

using System;

public class TestFormatter
{
   public static void Main()
   {
      int acctNumber = 79203159;
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
      try {
         Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
      }
      catch (FormatException e) {
         Console.WriteLine(e.Message);
      }
   }
}

public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType) 
   {
      if (formatType == typeof(ICustomFormatter))        
         return this; 
      else
         return null;
   }

   public string Format(string format, 
	                     object arg, 
	                     IFormatProvider formatProvider) 
   {                       
      if (! this.Equals(formatProvider))
      {
         return null;
      }
      else
      {
         if (String.IsNullOrEmpty(format)) 
            format = "G";

         string customerString = arg.ToString();
         if (customerString.Length < 8)
            customerString = customerString.PadLeft(8, '0');

         format = format.ToUpper();
         switch (format)
         {
            case "G":
               return customerString.Substring(0, 1) + "-" +
                                     customerString.Substring(1, 5) + "-" +
                                     customerString.Substring(6);
            case "S":                          
               return customerString.Substring(0, 1) + "/" +
                                     customerString.Substring(1, 5) + "/" +
                                     customerString.Substring(6);
            case "P":                          
               return customerString.Substring(0, 1) + "." +
                                     customerString.Substring(1, 5) + "." +
                                     customerString.Substring(6);
            default:
               throw new FormatException( 
                         String.Format("The '{0}' format specifier is not supported.", format));
         }
      }   
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.

這個範例會定義自訂的格式提供者實作ICustomFormatterIFormatProvider介面做兩件事︰

  • 它會顯示參數傳遞至其ICustomFormatter.Format實作。 這可讓我們查看哪些參數Format(IFormatProvider, String, Object[])方法將傳遞至自訂的格式實作每個物件,它會嘗試格式化。 當您在偵錯您的應用程式,這非常有用。

  • 要格式化的物件是否要使用"R"標準格式字串格式化為不帶正負號的位元組值,將自訂格式器會格式化為羅馬數字的數字的值。

using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(String format, Object obj, IFormatProvider provider) 
   {
      // Display information about method call.
      string formatString = format ?? "<null>";
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, obj ?? "<null>", formatString);

      if (obj == null) return String.Empty;

      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj is Byte && formatString.ToUpper().Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String returnString = String.Empty;

         // Get the hundreds digit(s)
         result = Math.DivRem(value, 100, out remainder);
         if (result > 0)  
            returnString = new String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math.DivRem(value, 50, out remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math.DivRem(value, 10, out remainder);
         if (result > 0)
            returnString += new String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math.DivRem(value, 5, out remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += new String('I', remainder);

         // Check whether we have too many X characters.
         int pos = returnString.IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString.IndexOf("L"); 
            if (xPos >= 0 & xPos == pos - 1)
               returnString = returnString.Replace("LXXXX", "XC");
            else
               returnString = returnString.Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString.IndexOf("IIII");
         if (pos >= 0)
            if (returnString.IndexOf("V") >= 0)
               returnString = returnString.Replace("VIIII", "IX");
            else
               returnString = returnString.Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj is IFormattable)
         return ((IFormattable) obj).ToString(format, CultureInfo.CurrentCulture);
      else
         return obj.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      int n = 10;
      double value = 16.935;
      DateTime day = DateTime.Now;
      InterceptProvider provider = new InterceptProvider();
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
      Console.WriteLine(String.Format(provider, "{0}: {1:F}\n", "Today: ", 
                                      (DayOfWeek) DateTime.Now.DayOfWeek));
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
   }
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX

.NET Framework

所有多載支援︰ 4.5、 4、 3.5、 3.0、 2.0、 1.1、 1.0

.NET Framework Client Profile

所有多載支援︰ 4、 3.5 SP1

可攜式類別庫

只有Format(String, Object[])Format(IFormatProvider, String, Object[])支援

適用於 Windows 市集應用程式的 .NET

只有Format(String, Object[])Format(IFormatProvider, String, Object[])支援 Windows 8 中

格式項目的一般語法如下︰

{index[,alignment][: formatString]}

其中對齊是帶正負號的整數,定義欄位寬度。 如果此值為負數,此欄位中的文字是靠左對齊。 如果是正數,文字是靠右對齊。

所有標準數值格式字串except (可搭配只有整數) 的"D"、"G"、"R",和"X"允許精確度規範定義結果字串中的小數位數數目。 下列範例會使用標準數值格式字串來控制結果字串中的小數位數數目。

using System;

public class Example
{
   public static void Main()
   {
      object[] values = { 1603, 1794.68235, 15436.14 };
      string result;
      foreach (var value in values) {
         result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}\n",
                                Convert.ToDouble(value), Convert.ToDouble(value) / 10000);
         Console.WriteLine(result);
      }                           
   }
}
// The example displays the following output:
//       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
//    
//       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
//    
//      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %

如果您使用自訂數值格式字串,使用"0"格式規範來控制在結果字串中,如下列範例所示的小數位數數目。

using System;

public class Example
{
   public static void Main()
   {
      decimal value = 16309.5436m;
      string result = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                                    value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//        16309.54360    16,309.54    16309.544

根據預設,格式化作業只會顯示非零的整數位數。 如果您正在格式化的整數,您可以使用"D"和"X"標準格式字串的有效位數規範來控制的位數。

using System;

public class Example
{
   public static void Main()
   {
      int value = 1326;
      string result = String.Format("{0,10:D6} {0,10:X8}", value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//     001326   0000052E

您可以在使用 「 0 」 產生的結果字串,以指定的數字的整數位數的整數或浮點數,加上前置零填補自訂數值格式規範,如下列範例所示。

using System;

public class Example
{
   public static void Main()
   {
      int value = 16342;
      string result = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                                    value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//           00016342       00016342.000    0,000,016,342.0

沒有任何實用的限制。 第二個參數Format(IFormatProvider, String, Object[])方法會標記為ParamArrayAttribute屬性,可讓您包含分隔的清單或物件陣列做為格式清單。

例如,如何避免下列方法呼叫擲回FormatException例外狀況?

result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose);

左或右大括號會解譯為開頭或結尾的格式項目。 若要解譯為常值,則必須逸出。 您加入另一個大括號逸出括號 ("{{"和"}}"而不是"{"和"}"),在下列的方法呼叫中︰

result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose);

不過,即使逸出大括號會輕鬆地譯。 我們建議您在 [格式] 清單中包含大括號,並將下列範例所示將其插入結果字串中使用的格式項目。

result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}");

最常見的例外狀況的原因是格式項目的索引未對應到 [格式] 清單中的物件。 通常這表示您已經 misnumbered 格式項目的索引,或您忘了在 [格式] 清單中包含的物件。 有時候,例外狀況會錯字; 的結果例如,一般的錯誤是打錯"["(左括號) 而不是"{"(左大括號)。

例如,下列程式碼會擲回FormatException例外狀況︰

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      int[]  numbers = new int[4];
      int total = 0;
      for (int ctr = 0; ctr <= 2; ctr++) {
         int number = rnd.Next(1001);
         numbers[ctr] = number;
         total += number;
      }   
      numbers[3] = total;
      Console.WriteLine("{0} + {1} + {2} = {3}", numbers);   
   }
}

這是編譯器多載解析的問題。 因為編譯器無法轉換成物件陣列的整數的陣列,它會將整數陣列視為單一引數,因此它會呼叫Format(String, Object)方法。 因為有四個格式項目,但單一項目 [格式] 清單中的,會擲回例外狀況。

Visual Basic 或 C# 都不可以轉換成物件陣列的整數陣列,所以您必須自行執行轉換,然後再呼叫Format(String, Object[])方法。 下列範例提供一個實作。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      int[]  numbers = new int[4];
      int total = 0;
      for (int ctr = 0; ctr <= 2; ctr++) {
         int number = rnd.Next(1001);
         numbers[ctr] = number;
         total += number;
      }   
      numbers[3] = total;
      object[] values = new object[numbers.Length];
      numbers.CopyTo(values, 0);
      Console.WriteLine("{0} + {1} + {2} = {3}", values);   
   }
}
回到頁首
顯示: