.NET での型の書式設定Formatting Types in .NET

書式設定とはクラス、構造体、または列挙値のインスタンスを文字列形式に変換するプロセスのことで、多くの場合、変換した文字列をユーザーに表示したり、逆シリアル化して元のデータ型を復元したりするために行います。Formatting is the process of converting an instance of a class, structure, or enumeration value to its string representation, often so that the resulting string can be displayed to users or deserialized to restore the original data type. この変換には次のような問題がある場合があります。This conversion can pose a number of challenges:

  • 値の内部での格納方法に、ユーザーが望む表示方法が反映されない場合がある。The way that values are stored internally does not necessarily reflect the way that users want to view them. たとえば、電話番号が 8009999999 という形式で格納されることがあります。これではユーザーにはわかりにくいため、For example, a telephone number might be stored in the form 8009999999, which is not user-friendly. 代わりに 800-999-9999 と表示する必要があります。It should instead be displayed as 800-999-9999. 数値をこのように書式指定する例については、「 カスタム書式指定文字列 」を参照してください。See the Custom Format Strings section for an example that formats a number in this way.

  • オブジェクトから文字列形式への変換が直観的に理解しづらい場合がある。Sometimes the conversion of an object to its string representation is not intuitive. たとえば、Temperature オブジェクトや Person オブジェクトの文字列形式がどのようになるのか、明確ではありません。For example, it is not clear how the string representation of a Temperature object or a Person object should appear. Temperature オブジェクトをさまざまな方法で書式指定する例については、「 標準書式指定文字列 」を参照してください。For an example that formats a Temperature object in a variety of ways, see the Standard Format Strings section.

  • 通常、カルチャ依存の書式指定が必要になる。Values often require culture-sensitive formatting. たとえば、通貨値を数字で表すアプリケーションでは、数値文字列にカルチャ別の通貨記号、桁区切り記号 (ほとんどのカルチャでは 1000 単位)、および小数点を含める必要があります。For example, in an application that uses numbers to reflect monetary values, numeric strings should include the current culture’s currency symbol, group separator (which, in most cultures, is the thousands separator), and decimal symbol. 例については、「 書式プロバイダーと IFormatProvider インターフェイスによるカルチャに依存した書式指定 」を参照してください。For an example, see the Culture-Sensitive Formatting with Format Providers and the IFormatProvider Interface section.

  • アプリケーションによっては、同じ値をさまざまな方法で表示する必要がある。An application may have to display the same value in different ways. たとえば、列挙型のメンバーを表すために、その名前の文字列形式を表示する場合や、基になる値を表示する場合が考えられます。For example, an application may represent an enumeration member by displaying a string representation of its name or by displaying its underlying value. DayOfWeek 列挙体のメンバーをさまざまな方法で書式指定する例については、「 標準書式指定文字列 」を参照してください。For an example that formats a member of the DayOfWeek enumeration in different ways, see the Standard Format Strings section.

注意

書式設定は型の値を文字列形式に変換します。Formatting converts the value of a type into a string representation. 解析は書式設定の逆の操作で、Parsing is the inverse of formatting. 文字列形式からデータ型のインスタンスを作成します。A parsing operation creates an instance of a data type from its string representation. 他のデータ型への文字列の変換については、「 Parsing Strings」を参照してください。For information about converting strings to other data types, see Parsing Strings.

.NET は書式設定機能が充実しているため、開発者はこうした要件を満たすことができます。.NET provides rich formatting support that enables developers to address these requirements.

この概要は、次のセクションで構成されています。This overview contains the following sections:

.NET での書式設定Formatting in .NET

基本的な書式設定の方式は、Object.ToString メソッドによって既定として実装されます。このメソッドについては、このトピックの「ToString メソッドを使用した既定の書式設定 」のセクションを参照してください。The basic mechanism for formatting is the default implementation of the Object.ToString method, which is discussed in the Default Formatting Using the ToString Method section later in this topic. ただし、.NET には、この既定の書式設定機能を変更および拡張する方法がいくつかあります。However, .NET provides several ways to modify and extend its default formatting support. 次に例を示します。These include the following:

  • Object.ToString メソッドをオーバーライドして、オブジェクトの値のカスタム文字列形式を定義する方法。Overriding the Object.ToString method to define a custom string representation of an object’s value. 詳細については、このトピックの「 ToString メソッドのオーバーライド 」のセクションを参照してください。For more information, see the Overriding the ToString Method section later in this topic.

  • オブジェクトの値の文字列形式に複数の形式を持たせる書式指定子を定義する方法。Defining format specifiers that enable the string representation of an object’s value to take multiple forms. たとえば、次のステートメントでは "X" 書式指定子を使用して整数を 16 進値の文字列形式に変換します。For example, the "X" format specifier in the following statement converts an integer to the string representation of a hexadecimal value.

    int integerValue = 60312;
    Console.WriteLine(integerValue.ToString("X"));   // Displays EB98.
    
    Dim integerValue As Integer = 60312
    Console.WriteLine(integerValue.ToString("X"))   ' Displays EB98.
    

    書式指定子の詳細については、「 ToString メソッドと書式指定文字列 」のセクションを参照してください。For more information about format specifiers, see the ToString Method and Format Strings section.

  • 書式プロバイダーを使用して、特定のカルチャの書式指定規則を利用する方法。Using format providers to take advantage of the formatting conventions of a specific culture. たとえば、次のステートメントでは en-US カルチャの書式指定規則を使用して通貨値を表示します。For example, the following statement displays a currency value by using the formatting conventions of the en-US culture.

    double cost = 1632.54; 
    Console.WriteLine(cost.ToString("C", 
                      new System.Globalization.CultureInfo("en-US")));   
    // The example displays the following output:
    //       $1,632.54
    
    Dim cost As Double = 1632.54
    Console.WriteLine(cost.ToString("C", New System.Globalization.CultureInfo("en-US")))
    ' The example displays the following output:
    '       $1,632.54
    

    書式プロバイダーを使用した書式設定の詳細については、「 書式プロバイダーおよび IFormatProvider インターフェイス 」のセクションを参照してください。For more information about formatting with format providers, see the Format Providers and the IFormatProvider Interface section.

  • IFormattable インターフェイスを実装して、 Convert クラスによる文字列変換と複合書式指定の両方をサポートする方法。Implementing the IFormattable interface to support both string conversion with the Convert class and composite formatting. 詳細については、「 IFormattable インターフェイス 」のセクションを参照してください。For more information, see the IFormattable Interface section.

  • 複合書式指定を使用して、値の文字列形式を大きな文字列に埋め込む方法。Using composite formatting to embed the string representation of a value in a larger string. 詳細については、「 複合書式指定 」のセクションを参照してください。For more information, see the Composite Formatting section.

  • ICustomFormatter および IFormatProvider を実装して、完全なカスタム書式設定ソリューションを提供する方法。Implementing ICustomFormatter and IFormatProvider to provide a complete custom formatting solution. 詳細については、「 ICustomFormatter を使用したカスタム書式設定 」のセクションを参照してください。For more information, see the Custom Formatting with ICustomFormatter section.

以降のセクションでは、オブジェクトを文字列形式に変換するこれらの方法について説明します。The following sections examine these methods for converting an object to its string representation.

ToString メソッドを使用した既定の書式設定Default Formatting Using the ToString Method

System.Object から派生したすべての型は、既定で型の名前を返す、パラメーターなしの ToString メソッドを自動的に継承します。Every type that is derived from System.Object automatically inherits a parameterless ToString method, which returns the name of the type by default. 既定の ToString メソッドの例を次に示します。The following example illustrates the default ToString method. このコード例では、実装を持たない Automobile という名前のクラスを定義します。It defines a class named Automobile that has no implementation. このクラスがインスタンス化され、 ToString メソッドが呼び出されると、その型の名前が表示されます。When the class is instantiated and its ToString method is called, it displays its type name. サンプルでは、 ToString メソッドが明示的に呼び出されないことに注意してください。Note that the ToString method is not explicitly called in the example. Console.WriteLine(Object) メソッドは引数として渡されたオブジェクトの ToString メソッドを暗黙的に呼び出します。The Console.WriteLine(Object) method implicitly calls the ToString method of the object passed to it as an argument.

using System;

public class Automobile
{
   // No implementation. All members are inherited from Object.
}

public class Example
{
   public static void Main()
   {
      Automobile firstAuto = new Automobile();
      Console.WriteLine(firstAuto);
   }
}
// The example displays the following output:
//       Automobile
Public Class Automobile
   ' No implementation. All members are inherited from Object.
End Class

Module Example
   Public Sub Main()
      Dim firstAuto As New Automobile()
      Console.WriteLine(firstAuto)
   End Sub
End Module
' The example displays the following output:
'       Automobile

警告

Windows 8.1Windows 8.1 以降、Windows Runtime には、既定の書式指定をサポートする単一のメソッド IStringable.ToString を備えた IStringable インターフェイスが含まれています。Starting with Windows 8.1Windows 8.1, the Windows Runtime includes an IStringable interface with a single method, IStringable.ToString, which provides default formatting support. ただし、マネージド型では IStringable インターフェイスを実装しないことをお勧めします。However, we recommend that managed types do not implement the IStringable interface. 詳細については、 Windows Runtime リファレンス ページの「The IStringable and the Object.ToString Interface (Windows ランタイムと IStringable インターフェイス)」を参照してください。For more information, see "The Windows Runtime and the IStringable Interface" section on the Object.ToString reference page.

インターフェイス以外の型はすべて Objectから派生するため、この機能はカスタムのクラスまたは構造体に自動的に提供されます。Because all types other than interfaces are derived from Object, this functionality is automatically provided to your custom classes or structures. ただし、既定の ToString メソッドで提供される機能には制限があります。型を識別しますが、型のインスタンスに関する情報を指定すると、エラーになります。However, the functionality offered by the default ToString method, is limited: Although it identifies the type, it fails to provide any information about an instance of the type. それ自体に関する情報を提供するオブジェクトの文字列形式を提供するには、 ToString メソッドをオーバーライドする必要があります。To provide a string representation of an object that provides information about that object, you must override the ToString method.

注意

構造体は、 ValueTypeから派生した Objectを継承します。Structures inherit from ValueType, which in turn is derived from Object. ValueTypeObject.ToStringをオーバーライドしますが、その実装は同じです。Although ValueType overrides Object.ToString, its implementation is identical.

ToString メソッドのオーバーライドOverriding the ToString Method

型の名前の表示は用途が限定され、型のコンシューマー側でインスタンスを別のインスタンスと区別することはできません。Displaying the name of a type is often of limited use and does not allow consumers of your types to differentiate one instance from another. ただし、 ToString メソッドをオーバーライドして、もっと役に立つオブジェクトの値の形式を作成することができます。However, you can override the ToString method to provide a more useful representation of an object’s value. 次の例では Temperature オブジェクトを定義し、その ToString メソッドをオーバーライドして、温度を摂氏で表示します。The following example defines a Temperature object and overrides its ToString method to display the temperature in degrees Celsius.

using System;

public class Temperature
{
   private decimal temp;
   
   public Temperature(decimal temperature)
   {
      this.temp = temperature;   
   }

   public override string ToString()
   {
      return this.temp.ToString("N1") + "°C";
   }
}

public class Example
{
   public static void Main()
   {
      Temperature currentTemperature = new Temperature(23.6m);
      Console.WriteLine("The current temperature is " +
                        currentTemperature.ToString());
   }
}
// The example displays the following output:
//       The current temperature is 23.6°C.
Public Class Temperature
   Private temp As Decimal
   
   Public Sub New(temperature As Decimal)
      Me.temp = temperature
   End Sub
   
   Public Overrides Function ToString() As String
      Return Me.temp.ToString("N1") + "°C"   
   End Function
End Class

Module Example
   Public Sub Main()
      Dim currentTemperature As New Temperature(23.6d)
      Console.WriteLine("The current temperature is " +
                        currentTemperature.ToString())
   End Sub
End Module
' The example displays the following output:
'       The current temperature is 23.6°C.

.NET では、各プリミティブ値型の ToString メソッドは、名前の代わりにオブジェクトの値を表示するようにオーバーライドされています。In .NET, the ToString method of each primitive value type has been overridden to display the object’s value instead of its name. 各プリミティブ型のオーバーライドを次の表に示します。The following table shows the override for each primitive type. オーバーライドされているメソッドのほとんどは ToString メソッドの別のオーバーロードを呼び出し、それにその型の一般書式を定義する "G" 書式指定子と、現在のカルチャを表す IFormatProvider オブジェクトを渡します。Note that most of the overridden methods call another overload of the ToString method and pass it the "G" format specifier, which defines the general format for its type, and an IFormatProvider object that represents the current culture.

Type ToString のオーバーライドToString override
Boolean Boolean.TrueString または Boolean.FalseStringを返します。Returns either Boolean.TrueString or Boolean.FalseString.
Byte Byte.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Byte 値の書式設定をします。Calls Byte.ToString("G", NumberFormatInfo.CurrentInfo) to format the Byte value for the current culture.
Char 文字を文字列として返します。Returns the character as a string.
DateTime DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて日付と時刻の値の書式設定をします。Calls DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo) to format the date and time value for the current culture.
Decimal Decimal.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Decimal 値の書式設定をします。Calls Decimal.ToString("G", NumberFormatInfo.CurrentInfo) to format the Decimal value for the current culture.
Double Double.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Double 値の書式設定をします。Calls Double.ToString("G", NumberFormatInfo.CurrentInfo) to format the Double value for the current culture.
Int16 Int16.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Int16 値の書式設定をします。Calls Int16.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int16 value for the current culture.
Int32 Int32.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Int32 値の書式設定をします。Calls Int32.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int32 value for the current culture.
Int64 Int64.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Int64 値の書式設定をします。Calls Int64.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int64 value for the current culture.
SByte SByte.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて SByte 値の書式設定をします。Calls SByte.ToString("G", NumberFormatInfo.CurrentInfo) to format the SByte value for the current culture.
Single Single.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて Single 値の書式設定をします。Calls Single.ToString("G", NumberFormatInfo.CurrentInfo) to format the Single value for the current culture.
UInt16 UInt16.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて UInt16 値の書式設定をします。Calls UInt16.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt16 value for the current culture.
UInt32 UInt32.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて UInt32 値の書式設定をします。Calls UInt32.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt32 value for the current culture.
UInt64 UInt64.ToString("G", NumberFormatInfo.CurrentInfo) を呼び出して、現在のカルチャに合わせて UInt64 値の書式設定をします。Calls UInt64.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt64 value for the current culture.

ToString メソッドと書式指定文字列The ToString Method and Format Strings

既定の ToString メソッドや ToString のオーバーライドの使用は、オブジェクトの文字列形式が 1 つの場合に適しています。Relying on the default ToString method or overriding ToString is appropriate when an object has a single string representation. しかし、多くの場合オブジェクトの値には複数の形式があります。However, the value of an object often has multiple representations. たとえば、温度は華氏、摂氏、またはケルビンで表現できます。For example, a temperature can be expressed in degrees Fahrenheit, degrees Celsius, or kelvins. また、整数値 10 は 10、10.0、1.0e01、$10.00 などの多くの方法で表すことができます。Similarly, the integer value 10 can be represented in numerous ways, including 10, 10.0, 1.0e01, or $10.00.

.NET では、書式指定文字列を使用することで、1 つの値に複数の文字列形式を持たせることができます。To enable a single value to have multiple string representations, .NET uses format strings. 書式指定文字列とは定義済みの書式指定子を 1 つ以上含む文字列です。書式指定子とは、 ToString メソッドによるその出力の書式設定方法を定義する 1 文字または文字グループです。A format string is a string that contains one or more predefined format specifiers, which are single characters or groups of characters that define how the ToString method should format its output. 書式指定文字列はパラメーターとしてオブジェクトの ToString メソッドに渡され、オブジェクトの値の文字列形式の表示方法を決定します。The format string is then passed as a parameter to the object's ToString method and determines how the string representation of that object's value should appear.

.NET では、すべての数値型、日付/時刻型、および列挙型で、定義済みの一連の書式指定子をサポートしています。All numeric types, date and time types, and enumeration types in .NET support a predefined set of format specifiers. 書式指定文字列を使用して、アプリケーションで定義されたデータ型の文字列形式を複数定義することもできます。You can also use format strings to define multiple string representations of your application-defined data types.

標準書式指定文字列Standard Format Strings

標準書式指定文字列には、適用先のオブジェクトの文字列形式を定義する英字の単一の書式指定子と、結果文字列に表示される桁数に影響するオプションの精度指定子が含まれます。A standard format string contains a single format specifier, which is an alphabetic character that defines the string representation of the object to which it is applied, along with an optional precision specifier that affects how many digits are displayed in the result string. 精度指定子が省略されるかサポートされていない場合、標準書式指定子は標準書式指定文字列と同じになります。If the precision specifier is omitted or is not supported, a standard format specifier is equivalent to a standard format string.

.NET では、すべての数値型、すべての日付/時刻型、およびすべての列挙型に対して一連の標準書式指定子が定義されています。.NET defines a set of standard format specifiers for all numeric types, all date and time types, and all enumeration types. たとえば、それらのカテゴリごとに、対応する型の値の一般的な文字列形式を定義する "G" 標準書式指定子がサポートされています。For example, each of these categories supports a "G" standard format specifier, which defines a general string representation of a value of that type.

列挙型の標準書式指定文字列は、値の文字列形式を直接制御します。Standard format strings for enumeration types directly control the string representation of a value. 列挙値の ToString メソッドに渡された書式指定文字列によって、文字列名 ("G" 書式指定子および "F" 書式指定子)、基になる整数値 ("D" 書式指定子)、または 16 進値 ("X" 書式指定子) のどの形式で値を表示するかが決定します。The format strings passed to an enumeration value’s ToString method determine whether the value is displayed using its string name (the "G" and "F" format specifiers), its underlying integral value (the "D" format specifier), or its hexadecimal value (the "X" format specifier). 次のコード例では、標準書式指定文字列を使用して、 DayOfWeek 列挙値の書式を設定する方法を示しています。The following example illustrates the use of standard format strings to format a DayOfWeek enumeration value.

DayOfWeek thisDay = DayOfWeek.Monday;
string[] formatStrings = {"G", "F", "D", "X"};

foreach (string formatString in formatStrings)
   Console.WriteLine(thisDay.ToString(formatString));
// The example displays the following output:
//       Monday
//       Monday
//       1
//       00000001
Dim thisDay As DayOfWeek = DayOfWeek.Monday
Dim formatStrings() As String = {"G", "F", "D", "X"}

For Each formatString As String In formatStrings
   Console.WriteLine(thisDay.ToString(formatString))
Next
' The example displays the following output:
'       Monday
'       Monday
'       1
'       00000001

列挙型書式指定文字列については、「 Enumeration Format Strings」を参照してください。For information about enumeration format strings, see Enumeration Format Strings.

数値型の標準書式指定文字列は、通常、表示される桁数が 1 つ以上のプロパティ値によって制御される結果文字列を定義します。Standard format strings for numeric types usually define a result string whose precise appearance is controlled by one or more property values. たとえば、"C" 書式指定子は数字を通貨値として書式設定します。For example, the "C" format specifier formats a number as a currency value. 唯一のパラメーターとして "C" 書式指定子を渡して ToString メソッドを呼び出した場合、現在のカルチャの NumberFormatInfo オブジェクトの次のプロパティ値を使用して数値の文字列形式を定義します。When you call the ToString method with the "C" format specifier as the only parameter, the following property values from the current culture’s NumberFormatInfo object are used to define the string representation of the numeric value:

  • CurrencySymbol プロパティ。現在のカルチャの通貨記号を指定します。The CurrencySymbol property, which specifies the current culture’s currency symbol.

  • CurrencyNegativePattern プロパティまたは CurrencyPositivePattern プロパティ。次の情報を特定する整数を返します。The CurrencyNegativePattern or CurrencyPositivePattern property, which returns an integer that determines the following:

    • 通貨記号の位置。The placement of the currency symbol.

    • 負の値を表すために、先頭の負の符号、末尾の負の符号、またはかっこのどれを使用するか。Whether negative values are indicated by a leading negative sign, a trailing negative sign, or parentheses.

    • 数値と通貨記号の間にスペース文字を表示するかどうか。Whether a space appears between the numeric value and the currency symbol.

  • CurrencyDecimalDigits プロパティ。結果文字列の小数点以下の桁数を定義します。The CurrencyDecimalDigits property, which defines the number of fractional digits in the result string.

  • CurrencyDecimalSeparator プロパティ。結果文字列の小数点の記号を定義します。The CurrencyDecimalSeparator property, which defines the decimal separator symbol in the result string.

  • CurrencyGroupSeparator プロパティ。桁区切り記号を定義します。The CurrencyGroupSeparator property, which defines the group separator symbol.

  • CurrencyGroupSizes プロパティ。整数部の各グループの桁数を定義します。The CurrencyGroupSizes property, which defines the number of digits in each group to the left of the decimal.

  • NegativeSign プロパティ。かっこを使用せずに負の値を表す場合に結果文字列で使用する負の符号を決定します。The NegativeSign property, which determines the negative sign used in the result string if parentheses are not used to indicate negative values.

さらに、数値書式指定文字列には、精度指定子が含まれる場合があります。In addition, numeric format strings may include a precision specifier. この指定子の意味は一緒に使用される書式指定文字列によって異なりますが、通常は、結果文字列に表示される合計桁数か小数点以下の桁数を示します。The meaning of this specifier depends on the format string with which it is used, but it typically indicates either the total number of digits or the number of fractional digits that should appear in the result string. たとえば、次の例では、"X4" の標準数値文字列と精度指定子を使用して、4 桁の 16 進数から成る文字列値を作成します。For example, the following example uses the "X4" standard numeric string and a precision specifier to create a string value that has four hexadecimal digits.

byte[] byteValues = { 12, 163, 255 };
foreach (byte byteValue in byteValues)
   Console.WriteLine(byteValue.ToString("X4"));
// The example displays the following output:
//       000C
//       00A3
//       00FF
Dim byteValues() As Byte = { 12, 163, 255 }
For Each byteValue As Byte In byteValues
   Console.WriteLine(byteValue.ToString("X4"))
Next
' The example displays the following output:
'       000C
'       00A3
'       00FF

標準の数値書式指定文字列の詳細については、「 Standard Numeric Format Strings」を参照してください。For more information about standard numeric formatting strings, see Standard Numeric Format Strings.

日付と時刻の値の標準書式指定文字列は、特定の DateTimeFormatInfo プロパティに格納されているカスタム書式指定文字列のエイリアスです。Standard format strings for date and time values are aliases for custom format strings stored by a particular DateTimeFormatInfo property. たとえば、"D" 書式指定子を渡して日付と時刻の値の ToString メソッドを呼び出すと、現在のカルチャの DateTimeFormatInfo.LongDatePattern プロパティに格納されているカスタム書式指定文字列を使用して日付と時刻が表示されますFor example, calling the ToString method of a date and time value with the "D" format specifier displays the date and time by using the custom format string stored in the current culture’s DateTimeFormatInfo.LongDatePattern property. (カスタム書式指定文字列の詳細については、次のセクションを参照してください)。この関係を次の例に示します。(For more information about custom format strings, see the next section.) The following example illustrates this relationship.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 6, 30);
      Console.WriteLine("D Format Specifier:     {0:D}", date1);
      string longPattern = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern;
      Console.WriteLine("'{0}' custom format string:     {1}", 
                        longPattern, date1.ToString(longPattern));
   }
}
// The example displays the following output when run on a system whose
// current culture is en-US:
//    D Format Specifier:     Tuesday, June 30, 2009
//    'dddd, MMMM dd, yyyy' custom format string:     Tuesday, June 30, 2009
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim date1 As Date = #6/30/2009#
      Console.WriteLine("D Format Specifier:     {0:D}", date1)
      Dim longPattern As String = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern
      Console.WriteLine("'{0}' custom format string:     {1}", _
                        longPattern, date1.ToString(longPattern))
   End Sub
End Module
' The example displays the following output when run on a system whose
' current culture is en-US:
'    D Format Specifier:     Tuesday, June 30, 2009
'    'dddd, MMMM dd, yyyy' custom format string:     Tuesday, June 30, 2009

標準の日時書式指定文字列の詳細については、「 Standard Date and Time Format Strings」を参照してください。For more information about standard date and time format strings, see Standard Date and Time Format Strings.

また、標準書式指定文字列を使用して、オブジェクトの ToString(String) メソッドによって生成された、アプリケーション定義のオブジェクトの文字列形式を定義することもできます。You can also use standard format strings to define the string representation of an application-defined object that is produced by the object’s ToString(String) method. オブジェクトでサポートする特定の標準書式指定子を定義したり、それらで大文字と小文字を区別するかしないかを決定したりすることができます。You can define the specific standard format specifiers that your object supports, and you can determine whether they are case-sensitive or case-insensitive. ToString(String) メソッドの実装で、以下がサポートされます。Your implementation of the ToString(String) method should support the following:

  • オブジェクトの一般的な書式または共通の書式を表す "G" 書式指定子。A "G" format specifier that represents a customary or common format of the object. オブジェクトの ToString メソッドのパラメーターなしのオーバーロードで、その ToString(String) オーバーロードを呼び出し、それに "G" 標準書式指定文字列を渡します。The parameterless overload of your object's ToString method should call its ToString(String) overload and pass it the "G" standard format string.

  • null 参照 (Visual Basic の場合はNothing ) に相当する書式指定子。Support for a format specifier that is equal to a null reference (Nothing in Visual Basic). null 参照に相当する書式指定子は "G" 書式指定子と同等に扱う必要があります。A format specifier that is equal to a null reference should be considered equivalent to the "G" format specifier.

たとえば、 Temperature クラスの場合、内部的には温度を摂氏で格納し、書式指定子を使用して Temperature オブジェクトの値を摂氏、華氏、およびケルビンで表すことができます。For example, a Temperature class can internally store the temperature in degrees Celsius and use format specifiers to represent the value of the Temperature object in degrees Celsius, degrees Fahrenheit, and kelvins. 具体的な例を次に示します。The following example provides an illustration.

using System;

public class Temperature
{
   private decimal m_Temp;
   
   public Temperature(decimal temperature)
   {
      this.m_Temp = temperature;
   }
   
   public decimal Celsius
   {
      get { return this.m_Temp; }
   }
   
   public decimal Kelvin
   {
      get { return this.m_Temp + 273.15m; }   
   }
   
   public decimal Fahrenheit
   {
      get { return Math.Round(((decimal) (this.m_Temp * 9 / 5 + 32)), 2); }
   }

   public override string ToString()
   {
      return this.ToString("C");
   }
   
   public string ToString(string format)
   {  
      // Handle null or empty string.
      if (String.IsNullOrEmpty(format)) format = "C";
      // Remove spaces and convert to uppercase.
      format = format.Trim().ToUpperInvariant();      
      
      // Convert temperature to Fahrenheit and return string.
      switch (format)
      {
         // Convert temperature to Fahrenheit and return string.
         case "F":
            return this.Fahrenheit.ToString("N2") + " °F";
         // Convert temperature to Kelvin and return string.
         case "K":
            return this.Kelvin.ToString("N2") + " K";
         // return temperature in Celsius.
         case "G":
         case "C":
            return this.Celsius.ToString("N2") + " °C";
         default:
            throw new FormatException(String.Format("The '{0}' format string is not supported.", format));
      }      
   }
}

public class Example
{
   public static void Main()
   {
      Temperature temp1 = new Temperature(0m);
      Console.WriteLine(temp1.ToString());
      Console.WriteLine(temp1.ToString("G"));
      Console.WriteLine(temp1.ToString("C"));
      Console.WriteLine(temp1.ToString("F"));
      Console.WriteLine(temp1.ToString("K"));

      Temperature temp2 = new Temperature(-40m);
      Console.WriteLine(temp2.ToString());
      Console.WriteLine(temp2.ToString("G"));
      Console.WriteLine(temp2.ToString("C"));
      Console.WriteLine(temp2.ToString("F"));
      Console.WriteLine(temp2.ToString("K"));

      Temperature temp3 = new Temperature(16m);
      Console.WriteLine(temp3.ToString());
      Console.WriteLine(temp3.ToString("G"));
      Console.WriteLine(temp3.ToString("C"));
      Console.WriteLine(temp3.ToString("F"));
      Console.WriteLine(temp3.ToString("K"));
      
      Console.WriteLine(String.Format("The temperature is now {0:F}.", temp3));
   }
}
// The example displays the following output:
//       0.00 °C
//       0.00 °C
//       0.00 °C
//       32.00 °F
//       273.15 K
//       -40.00 °C
//       -40.00 °C
//       -40.00 °C
//       -40.00 °F
//       233.15 K
//       16.00 °C
//       16.00 °C
//       16.00 °C
//       60.80 °F
//       289.15 K
//       The temperature is now 16.00 °C.
Public Class Temperature
   Private m_Temp As Decimal
   
   Public Sub New(temperature As Decimal)
      Me.m_Temp = temperature
   End Sub
   
   Public ReadOnly Property Celsius() As Decimal
      Get
         Return Me.m_Temp
      End Get   
   End Property
   
   Public ReadOnly Property Kelvin() As Decimal
      Get
         Return Me.m_Temp + 273.15d   
      End Get
   End Property
   
   Public ReadOnly Property Fahrenheit() As Decimal
      Get
         Return Math.Round(CDec(Me.m_Temp * 9 / 5 + 32), 2)
      End Get      
   End Property

   Public Overrides Function ToString() As String
      Return Me.ToString("C")
   End Function
   
   Public Overloads Function ToString(format As String) As String  
      ' Handle null or empty string.
      If String.IsNullOrEmpty(format) Then format = "C"
      ' Remove spaces and convert to uppercase.
      format = format.Trim().ToUpperInvariant()      
      
      Select Case format
         Case "F"
           ' Convert temperature to Fahrenheit and return string.
            Return Me.Fahrenheit.ToString("N2") & " °F"
         Case "K"
            ' Convert temperature to Kelvin and return string.
            Return Me.Kelvin.ToString("N2") & " K"
         Case "C", "G"
            ' Return temperature in Celsius.
            Return Me.Celsius.ToString("N2") & " °C"
         Case Else
            Throw New FormatException(String.Format("The '{0}' format string is not supported.", format))
      End Select      
   End Function
End Class

Public Module Example
   Public Sub Main()
      Dim temp1 As New Temperature(0d)
      Console.WriteLine(temp1.ToString())
      Console.WriteLine(temp1.ToString("G"))
      Console.WriteLine(temp1.ToString("C"))
      Console.WriteLine(temp1.ToString("F"))
      Console.WriteLine(temp1.ToString("K"))

      Dim temp2 As New Temperature(-40d)
      Console.WriteLine(temp2.ToString())
      Console.WriteLine(temp2.ToString("G"))
      Console.WriteLine(temp2.ToString("C"))
      Console.WriteLine(temp2.ToString("F"))
      Console.WriteLine(temp2.ToString("K"))

      Dim temp3 As New Temperature(16d)
      Console.WriteLine(temp3.ToString())
      Console.WriteLine(temp3.ToString("G"))
      Console.WriteLine(temp3.ToString("C"))
      Console.WriteLine(temp3.ToString("F"))
      Console.WriteLine(temp3.ToString("K"))
      
      Console.WriteLine(String.Format("The temperature is now {0:F}.", temp3))
   End Sub
End Module
' The example displays the following output:
'       0.00 °C
'       0.00 °C
'       0.00 °C
'       32.00 °F
'       273.15 K
'       -40.00 °C
'       -40.00 °C
'       -40.00 °C
'       -40.00 °F
'       233.15 K
'       16.00 °C
'       16.00 °C
'       16.00 °C
'       60.80 °F
'       289.15 K
'       The temperature is now 16.00 °C.

カスタム書式指定文字列Custom Format Strings

.NET では、標準書式指定文字列のほかに、数値および日付と時刻の値の両方のカスタム書式指定文字列が定義されています。In addition to the standard format strings, .NET defines custom format strings for both numeric values and date and time values. カスタム書式指定文字列は、値の文字列形式を定義する 1 つ以上のカスタム書式指定子で構成されます。A custom format string consists of one or more custom format specifiers that define the string representation of a value. たとえば、"yyyy/mm/dd hh:mm:ss.ffff t zzz" というカスタム日時書式指定文字列の場合、en-US カルチャでは日付が "2008/11/15 07:45:00.0000 P -08:00" という文字列形式に変換されます。For example, the custom date and time format string "yyyy/mm/dd hh:mm:ss.ffff t zzz" converts a date to its string representation in the form "2008/11/15 07:45:00.0000 P -08:00" for the en-US culture. また、"0000" というカスタム書式指定文字列の場合、整数値 12 は "0012" に変換されます。Similarly, the custom format string "0000" converts the integer value 12 to "0012". カスタム書式指定文字列の一覧については、「 Custom Date and Time Format Strings 」および「 Custom Numeric Format Strings」を参照してください。For a complete list of custom format strings, see Custom Date and Time Format Strings and Custom Numeric Format Strings.

書式指定文字列が単一のカスタム書式指定子で構成される場合は、標準書式指定子と混同しないように、書式指定子の前にパーセント (%) 記号を付ける必要があります。If a format string consists of a single custom format specifier, the format specifier should be preceded by the percent (%) symbol to avoid confusion with a standard format specifier. 次の例では、"M" カスタム書式指定子を使用して、特定の日付の月を表す 1 桁または 2 桁の数値を表示します。The following example uses the "M" custom format specifier to display a one-digit or two-digit number of the month of a particular date.

DateTime date1 = new DateTime(2009, 9, 8);
Console.WriteLine(date1.ToString("%M"));       // Displays 9
Dim date1 As Date = #09/08/2009#
Console.WriteLine(date1.ToString("%M"))      ' Displays 9

日付および時刻の値の標準書式指定文字列の多くは、 DateTimeFormatInfo オブジェクトのプロパティによって定義されているカスタム書式指定文字列のエイリアスです。Many standard format strings for date and time values are aliases for custom format strings that are defined by properties of the DateTimeFormatInfo object. また、カスタム書式指定文字列を使用することで、数値または日付と時刻の値に対して、柔軟にアプリケーション定義の書式を指定できます。Custom format strings also offer considerable flexibility in providing application-defined formatting for numeric values or date and time values. 複数のカスタム書式指定子を 1 つのカスタム書式指定文字列に結合することによって、数値および日付と時刻の値の両方に対するカスタムの結果文字列を独自に定義することができます。You can define your own custom result strings for both numeric values and date and time values by combining multiple custom format specifiers into a single custom format string. 次の例では、月の名前、日付、および年の後に、かっこで囲んで曜日を表示するカスタム書式指定文字列を定義しています。The following example defines a custom format string that displays the day of the week in parentheses after the month name, day, and year.

string customFormat = "MMMM dd, yyyy (dddd)";
DateTime date1 = new DateTime(2009, 8, 28);
Console.WriteLine(date1.ToString(customFormat));   
// The example displays the following output if run on a system
// whose language is English:
//       August 28, 2009 (Friday)      
Dim customFormat As String = "MMMM dd, yyyy (dddd)"
Dim date1 As Date = #8/28/2009#
Console.WriteLine(date1.ToString(customFormat))   
' The example displays the following output if run on a system
' whose language is English:
'       August 28, 2009 (Friday)      

次の例では、 Int64 値を米国で標準的な 7 桁の電話番号を市外局番と共に表示するカスタム書式指定文字列を定義します。The following example defines a custom format string that displays an Int64 value as a standard, seven-digit U.S. telephone number along with its area code.

using System;

public class Example
{
   public static void Main()
   {
      long number = 8009999999;
      string fmt = "000-000-0000";
      Console.WriteLine(number.ToString(fmt));
   }
}
// The example displays the following output:
//        800-999-9999
Module Example
   Public Sub Main()
      Dim number As Long = 8009999999
      Dim fmt As String = "000-000-0000"
      Console.WriteLine(number.ToString(fmt))
   End Sub
End Module
' The example displays the following output:

' The example displays the following output:
'       800-999-9999

一般には、アプリケーション定義の型に対する書式設定のほとんどのニーズに標準書式指定文字列を使用して対応できますが、カスタム書式指定子を定義して型の書式を設定することもできます。Although standard format strings can generally handle most of the formatting needs for your application-defined types, you may also define custom format specifiers to format your types.

書式指定文字列と .NET 型Format Strings and .NET Types

すべての数値型 (つまり、ByteDecimalDoubleInt16Int32Int64SByteSingleUInt16UInt32UInt64、および BigInteger 型)、DateTimeDateTimeOffsetTimeSpanGuid、すべての列挙型が、書式指定文字列による書式設定に対応しています。All numeric types (that is, the Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64, and BigInteger types), as well as the DateTime, DateTimeOffset, TimeSpan, Guid, and all enumeration types, support formatting with format strings. 各型でサポートされている特定の書式指定文字列については、次のトピックを参照してください。For information on the specific format strings supported by each type, see the following topics:

TitleTitle 定義Definition
Standard Numeric Format StringsStandard Numeric Format Strings 数値に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of numeric values.
Custom Numeric Format StringsCustom Numeric Format Strings 数値に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for numeric values.
Standard Date and Time Format StringsStandard Date and Time Format Strings DateTimeDateTimeOffset 値に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of DateTime and DateTimeOffset values.
Custom Date and Time Format StringsCustom Date and Time Format Strings DateTimeDateTimeOffset 値に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for DateTime and DateTimeOffset values.
標準の時間間隔書式指定文字列Standard TimeSpan Format Strings 時間間隔に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of time intervals.
カスタム時間間隔書式指定文字列Custom TimeSpan Format Strings 時間間隔に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for time intervals.
Enumeration Format StringsEnumeration Format Strings 列挙型の文字列形式を作成するために使用される標準書式指定文字列について説明します。Describes standard format strings that are used to create string representations of enumeration values.
Guid.ToString(String) Guid 値の標準的書式指定文字列について説明します。Describes standard format strings for Guid values.

書式プロバイダーと IFormatProvider インターフェイスによるカルチャに依存した書式指定Culture-Sensitive Formatting with Format Providers and the IFormatProvider Interface

書式指定子を利用することでオブジェクトの書式をカスタマイズできますが、多くの場合、意味のあるオブジェクトの文字列形式を生成するには追加の書式設定情報が必要です。Although format specifiers let you customize the formatting of objects, producing a meaningful string representation of objects often requires additional formatting information. たとえば、"C" 標準書式指定文字列または "$ #,#.00" などのカスタム書式指定文字列を使用して数字を通貨値として書式設定する場合、少なくとも、正しい通貨記号、桁区切り記号、および小数点記号についての情報を書式設定された文字列に含めることができる必要があります。For example, formatting a number as a currency value by using either the "C" standard format string or a custom format string such as "$ #,#.00" requires, at a minimum, information about the correct currency symbol, group separator, and decimal separator to be available to include in the formatted string. .NET では、IFormatProvider インターフェイスによって、この追加の書式設定情報を利用できるようにします。このインターフェイスは、数値型および日付/時刻型の ToString メソッドの 1 つ以上のオーバーロードに対するパラメーターとして提供されます。In .NET, this additional formatting information is made available through the IFormatProvider interface, which is provided as a parameter to one or more overloads of the ToString method of numeric types and date and time types. IFormatProvider の実装は .NET で使用され、カルチャ固有の書式指定をサポートします。IFormatProvider implementations are used in .NET to support culture-specific formatting. それぞれ異なるカルチャを示す 3 つの IFormatProvider オブジェクトを使用してオブジェクトの書式を設定した場合に、その文字列形式がどのように変化するかを次の例に示します。The following example illustrates how the string representation of an object changes when it is formatted with three IFormatProvider objects that represent different cultures.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      decimal value = 1603.42m;
      Console.WriteLine(value.ToString("C3", new CultureInfo("en-US")));
      Console.WriteLine(value.ToString("C3", new CultureInfo("fr-FR")));
      Console.WriteLine(value.ToString("C3", new CultureInfo("de-DE")));
   }
}
// The example displays the following output:
//       $1,603.420
//       1 603,420 €
//       1.603,420 €
Imports System.Globalization

Public Module Example
   Public Sub Main()
      Dim value As Decimal = 1603.42d
      Console.WriteLine(value.ToString("C3", New CultureInfo("en-US")))
      Console.WriteLine(value.ToString("C3", New CultureInfo("fr-FR")))
      Console.WriteLine(value.ToString("C3", New CultureInfo("de-DE")))
   End Sub
End Module
' The example displays the following output:
'       $1,603.420
'       1 603,420 €
'       1.603,420 €

IFormatProvider インターフェイスには、 GetFormat(Type)という 1 つのメソッドが含まれています。このメソッドには、書式設定情報を提供するオブジェクトの型を指定する 1 つのパラメーターがあります。The IFormatProvider interface includes one method, GetFormat(Type), which has a single parameter that specifies the type of object that provides formatting information. このメソッドがその型のオブジェクトを提供できる場合は、それが返されます。If the method can provide an object of that type, it returns it. それ以外の場合は、null 参照 (Visual Basic の場合はNothing ) が返されます。Otherwise, it returns a null reference (Nothing in Visual Basic).

IFormatProvider.GetFormat はコールバック メソッドです。IFormatProvider.GetFormat is a callback method. ToString パラメーターを含む IFormatProvider メソッド オーバーロードを呼び出すと、その GetFormat オブジェクトの IFormatProvider メソッドが呼び出されます。When you call a ToString method overload that includes an IFormatProvider parameter, it calls the GetFormat method of that IFormatProvider object. GetFormat メソッドは、 formatType パラメーターで指定された、必要な書式設定情報を提供するオブジェクトを ToString メソッドに返します。The GetFormat method is responsible for returning an object that provides the necessary formatting information, as specified by its formatType parameter, to the ToString method.

数多くの書式指定メソッドや文字列変換メソッドに IFormatProvider型のパラメーターが含まれていますが、多くの場合、メソッドを呼び出すときはパラメーターの値は無視されます。A number of formatting or string conversion methods include a parameter of type IFormatProvider, but in many cases the value of the parameter is ignored when the method is called. Type メソッドに渡される IFormatProvider.GetFormat オブジェクトのパラメーターと型を使用する書式指定メソッドの一部を次の表に示します。The following table lists some of the formatting methods that use the parameter and the type of the Type object that they pass to the IFormatProvider.GetFormat method.

メソッドMethod formatType パラメーターの型Type of formatType parameter
数値型のToString メソッドToString method of numeric types System.Globalization.NumberFormatInfo
日付/時刻型のToString メソッドToString method of date and time types System.Globalization.DateTimeFormatInfo
String.Format System.ICustomFormatter
StringBuilder.AppendFormat System.ICustomFormatter

注意

数値型および日付/時刻型の ToString メソッドはオーバーロードされますが、 IFormatProvider パラメーターが含まれるのはそのうちの一部のオーバーロードだけです。The ToString methods of the numeric types and date and time types are overloaded, and only some of the overloads include an IFormatProvider parameter. メソッドに IFormatProvider型のパラメーターがない場合は、代わりに CultureInfo.CurrentCulture プロパティによって返されるオブジェクトが渡されます。If a method does not have a parameter of type IFormatProvider, the object that is returned by the CultureInfo.CurrentCulture property is passed instead. たとえば、既定の Int32.ToString() メソッドの呼び出しの場合は、最終的には Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture)のようなメソッド呼び出しになります。For example, a call to the default Int32.ToString() method ultimately results in a method call such as the following: Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture).

.NET には、IFormatProvider を実装する次の 3 つのクラスが用意されています。.NET provides three classes that implement IFormatProvider:

また、これらのクラスのうちのいずれかを置き換える独自の書式プロバイダーを実装できます。You can also implement your own format provider to replace any one of these classes. ただし、実装の GetFormat メソッドは、書式設定情報を ToString メソッドに渡す場合、前の表に示した型のオブジェクトを返す必要があります。However, your implementation’s GetFormat method must return an object of the type listed in the previous table if it has to provide formatting information to the ToString method.

数値のカルチャに依存した書式設定Culture-Sensitive Formatting of Numeric Values

既定では、数値の書式指定はカルチャに依存します。By default, the formatting of numeric values is culture-sensitive. 書式指定メソッドを呼び出すときにカルチャを指定しない場合は、現在のスレッド カルチャの書式指定規則が使用されます。If you do not specify a culture when you call a formatting method, the formatting conventions of the current thread culture are used. 次に示す例では、現在のスレッド カルチャを 4 回変更した後に、 Decimal.ToString(String) メソッドを呼び出します。This is illustrated in the following example, which changes the current thread culture four times and then calls the Decimal.ToString(String) method. 各ケースでは、結果の文字列は、現在のカルチャの書式指定規則を反映します。In each case, the result string reflects the formatting conventions of the current culture. これは、各数値型の ToString メソッドへの呼び出しを、 ToString(String) メソッドと ToString(String, IFormatProvider) メソッドがラップするためです。This is because the ToString and ToString(String) methods wrap calls to each numeric type's ToString(String, IFormatProvider) method.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "es-MX", "de-DE" };
      Decimal value = 1043.17m;
      
      foreach (var cultureName in cultureNames) {
         // Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name);
         Console.WriteLine(value.ToString("C2"));
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//       The current culture is en-US
//       $1,043.17
//       
//       The current culture is fr-FR
//       1 043,17 €
//       
//       The current culture is es-MX
//       $1,043.17
//       
//       The current culture is de-DE
//       1.043,17 €
Imports System.Globalization
Imports System.Threading 

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "es-MX", "de-DE" }
      Dim value As Decimal = 1043.17d 
      
      For Each cultureName In cultureNames
         ' Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name)
         Console.WriteLine(value.ToString("C2"))
         Console.WriteLine()
      Next                  
   End Sub
End Module
' The example displays the following output:
'       The current culture is en-US
'       $1,043.17
'       
'       The current culture is fr-FR
'       1 043,17 €
'       
'       The current culture is es-MX
'       $1,043.17
'       
'       The current culture is de-DE
'       1.043,17 €

また、 ToString パラメーターを持つ provider オーバーロードを呼び出して、次のどちらかを渡すことにより、特定カルチャの数値を書式指定することもできます。You can also format a numeric value for a specific culture by calling a ToString overload that has a provider parameter and passing it either of the following:

  • 使用される書式指定規則のカルチャを表す CultureInfo オブジェクト。A CultureInfo object that represents the culture whose formatting conventions are to be used. その CultureInfo.GetFormat メソッドは、 CultureInfo.NumberFormat プロパティの値を返します。このプロパティは、数値にカルチャ固有の書式指定情報を提供する NumberFormatInfo オブジェクトです。Its CultureInfo.GetFormat method returns the value of the CultureInfo.NumberFormat property, which is the NumberFormatInfo object that provides culture-specific formatting information for numeric values.

  • 使用されるカルチャ固有の書式指定規則を定義する NumberFormatInfo オブジェクト。A NumberFormatInfo object that defines the culture-specific formatting conventions to be used. その GetFormat メソッドでは、それ自身のインスタンスが返されます。Its GetFormat method returns an instance of itself.

次の例では、浮動小数点数を書式指定する際に、英語 (米国) と英語 (英国) のカルチャおよびフランス語とロシア語のニュートラル カルチャを表す NumberFormatInfo オブジェクトを使用します。The following example uses NumberFormatInfo objects that represent the English (United States) and English (Great Britain) cultures and the French and Russian neutral cultures to format a floating-point number.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {                                                                                                    
      Double value = 1043.62957;
      string[] cultureNames = { "en-US", "en-GB", "ru", "fr" };
      
      foreach (var name in cultureNames) {
         NumberFormatInfo nfi = CultureInfo.CreateSpecificCulture(name).NumberFormat;
         Console.WriteLine("{0,-6} {1}", name + ":", value.ToString("N3", nfi));
      }   
   }
}
// The example displays the following output:
//       en-US: 1,043.630
//       en-GB: 1,043.630
//       ru:    1 043,630
//       fr:    1 043,630
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim value As Double = 1043.62957
      Dim cultureNames() As String = { "en-US", "en-GB", "ru", "fr" }
      
      For Each name In cultureNames
         Dim nfi As NumberFormatInfo = CultureInfo.CreateSpecificCulture(name).NumberFormat
         Console.WriteLine("{0,-6} {1}", name + ":", value.ToString("N3", nfi))
      Next   
   End Sub
End Module
' The example displays the following output:
'       en-US: 1,043.630
'       en-GB: 1,043.630
'       ru:    1 043,630
'       fr:    1 043,630

日付と時刻の値のカルチャに依存した書式設定Culture-Sensitive Formatting of Date and Time Values

既定では、日時の値の書式指定はカルチャに依存します。By default, the formatting of date and time values is culture-sensitive. 書式指定メソッドを呼び出すときにカルチャを指定しない場合は、現在のスレッド カルチャの書式指定規則が使用されます。If you do not specify a culture when you call a formatting method, the formatting conventions of the current thread culture are used. 次に示す例では、現在のスレッド カルチャを 4 回変更した後に、 DateTime.ToString(String) メソッドを呼び出します。This is illustrated in the following example, which changes the current thread culture four times and then calls the DateTime.ToString(String) method. 各ケースでは、結果の文字列は、現在のカルチャの書式指定規則を反映します。In each case, the result string reflects the formatting conventions of the current culture. これは、 DateTime.ToString()DateTime.ToString(String)DateTimeOffset.ToString()DateTimeOffset.ToString(String) の各メソッドが、 DateTime.ToString(String, IFormatProvider) メソッドおよび DateTimeOffset.ToString(String, IFormatProvider) メソッドへの呼び出しをラップするためです。This is because the DateTime.ToString(), DateTime.ToString(String), DateTimeOffset.ToString(), and DateTimeOffset.ToString(String) methods wrap calls to the DateTime.ToString(String, IFormatProvider) and DateTimeOffset.ToString(String, IFormatProvider) methods.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "es-MX", "de-DE" };
      DateTime dateToFormat = new DateTime(2012, 5, 28, 11, 30, 0);
      
      foreach (var cultureName in cultureNames) {
         // Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name);
         Console.WriteLine(dateToFormat.ToString("F"));
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//       The current culture is en-US
//       Monday, May 28, 2012 11:30:00 AM
//       
//       The current culture is fr-FR
//       lundi 28 mai 2012 11:30:00
//       
//       The current culture is es-MX
//       lunes, 28 de mayo de 2012 11:30:00 a.m.
//       
//       The current culture is de-DE
//       Montag, 28. Mai 2012 11:30:00
Imports System.Globalization
Imports System.Threading 

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "es-MX", "de-DE" }
      Dim dateToFormat As Date = #5/28/2012 11:30AM#
      
      For Each cultureName In cultureNames
         ' Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name)
         Console.WriteLine(dateToFormat.ToString("F"))
         Console.WriteLine()
      Next                  
   End Sub
End Module
' The example displays the following output:
'       The current culture is en-US
'       Monday, May 28, 2012 11:30:00 AM
'       
'       The current culture is fr-FR
'       lundi 28 mai 2012 11:30:00
'       
'       The current culture is es-MX
'       lunes, 28 de mayo de 2012 11:30:00 a.m.
'       
'       The current culture is de-DE
'       Montag, 28. Mai 2012 11:30:00 

DateTime.ToString パラメーターを持つ DateTimeOffset.ToString または provider オーバーロードを呼び出して、次のどちらかを渡すことにより、特定カルチャの日時の値を書式指定することもできます。You can also format a date and time value for a specific culture by calling a DateTime.ToString or DateTimeOffset.ToString overload that has a provider parameter and passing it either of the following:

次の例では、日付を書式指定する際に、英語 (米国) と英語 (英国) のカルチャおよびフランス語とロシア語のニュートラル カルチャを表す DateTimeFormatInfo オブジェクトを使用します。The following example uses DateTimeFormatInfo objects that represent the English (United States) and English (Great Britain) cultures and the French and Russian neutral cultures to format a date.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {                                                                                                    
      DateTime dat1 = new DateTime(2012, 5, 28, 11, 30, 0);
      string[] cultureNames = { "en-US", "en-GB", "ru", "fr" };
      
      foreach (var name in cultureNames) {
         DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture(name).DateTimeFormat;
         Console.WriteLine("{0}: {1}", name, dat1.ToString(dtfi));
      }   
   }
}
// The example displays the following output:
//       en-US: 5/28/2012 11:30:00 AM
//       en-GB: 28/05/2012 11:30:00
//       ru: 28.05.2012 11:30:00
//       fr: 28/05/2012 11:30:00
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dat1 As Date = #5/28/2012 11:30AM#
      Dim cultureNames() As String = { "en-US", "en-GB", "ru", "fr" }
      
      For Each name In cultureNames
         Dim dtfi As DateTimeFormatInfo = CultureInfo.CreateSpecificCulture(name).DateTimeFormat
         Console.WriteLine("{0}: {1}", name, dat1.ToString(dtfi))
      Next   
   End Sub
End Module
' The example displays the following output:
'       en-US: 5/28/2012 11:30:00 AM
'       en-GB: 28/05/2012 11:30:00
'       ru: 28.05.2012 11:30:00
'       fr: 28/05/2012 11:30:00

IFormattable インターフェイスThe IFormattable Interface

通常、書式指定文字列および ToString パラメーターを使用して IFormatProvider メソッドをオーバーロードする型は、 IFormattable インターフェイスも実装します。Typically, types that overload the ToString method with a format string and an IFormatProvider parameter also implement the IFormattable interface. このインターフェイスには、 IFormattable.ToString(String, IFormatProvider)という単一のメンバーがあります。このメンバーには、パラメーターとして書式指定文字列と書式プロバイダーの両方が含まれています。This interface has a single member, IFormattable.ToString(String, IFormatProvider), that includes both a format string and a format provider as parameters.

アプリケーション定義のクラスに IFormattable インターフェイスを実装した場合、2 つの利点があります。Implementing the IFormattable interface for your application-defined class offers two advantages:

次の例では、 Temperature インターフェイスを実装する IFormattable クラスを定義しています。The following example defines a Temperature class that implements the IFormattable interface. このクラスでは、温度を摂氏で表示するために "C" 書式指定子または "G" 書式指定子、華氏で表示するために "F" 書式指定子、ケルビンで表示するために "K" 書式指定子をそれぞれサポートしています。It supports the "C" or "G" format specifiers to display the temperature in Celsius, the "F" format specifier to display the temperature in Fahrenheit, and the "K" format specifier to display the temperature in Kelvin.

using System;
using System.Globalization;

public class Temperature : IFormattable
{
   private decimal m_Temp;

   public Temperature(decimal temperature)
   {
      this.m_Temp = temperature;
   }
   
   public decimal Celsius
   {
      get { return this.m_Temp; }
   }
   
   public decimal Kelvin
   {
      get { return this.m_Temp + 273.15m; }   
   }
   
   public decimal Fahrenheit
   {
      get { return Math.Round((decimal) this.m_Temp * 9 / 5 + 32, 2); }
   }

   public override string ToString()
   {
      return this.ToString("G", null);
   }
   
   public string ToString(string format)
   {
      return this.ToString(format, null);
   }
   
   public string ToString(string format, IFormatProvider provider)  
   {
      // Handle null or empty arguments.
      if (String.IsNullOrEmpty(format))
         format = "G";
      // Remove any white space and covert to uppercase.
      format = format.Trim().ToUpperInvariant();

      if (provider == null)
         provider = NumberFormatInfo.CurrentInfo;
            
      switch (format)
      {
         // Convert temperature to Fahrenheit and return string.
         case "F":
            return this.Fahrenheit.ToString("N2", provider) + "°F";
         // Convert temperature to Kelvin and return string.
         case "K":
            return this.Kelvin.ToString("N2", provider) + "K";
         // Return temperature in Celsius.
         case "C":
         case "G":
            return this.Celsius.ToString("N2", provider) + "°C";
         default:
            throw new FormatException(String.Format("The '{0}' format string is not supported.", format));
      }      
   }
}
Imports System.Globalization

Public Class Temperature : Implements IFormattable
   Private m_Temp As Decimal

   Public Sub New(temperature As Decimal)
      Me.m_Temp = temperature
   End Sub
   
   Public ReadOnly Property Celsius() As Decimal
      Get
         Return Me.m_Temp
      End Get   
   End Property
   
   Public ReadOnly Property Kelvin() As Decimal
      Get
         Return Me.m_Temp + 273.15d   
      End Get
   End Property
   
   Public ReadOnly Property Fahrenheit() As Decimal
      Get
         Return Math.Round(CDec(Me.m_Temp * 9 / 5 + 32), 2)
      End Get      
   End Property

   Public Overrides Function ToString() As String
      Return Me.ToString("G", Nothing)
   End Function
   
   Public Overloads Function ToString(format As String) As String
      Return Me.ToString(format, Nothing)
   End Function
   
   Public Overloads Function ToString(format As String, provider As IFormatProvider) As String _  
      Implements IFormattable.ToString

      ' Handle null or empty arguments.
      If String.IsNullOrEmpty(format) Then format = "G"
      ' Remove any white space and convert to uppercase.
      format = format.Trim().ToUpperInvariant()

      If provider Is Nothing Then provider = NumberFormatInfo.CurrentInfo
            
      Select Case format
         ' Convert temperature to Fahrenheit and return string.
         Case "F"
            Return Me.Fahrenheit.ToString("N2", provider) & "°F"
         ' Convert temperature to Kelvin and return string.
         Case "K"
            Return Me.Kelvin.ToString("N2", provider) & "K"
         ' Return temperature in Celsius.
         Case "C", "G"
            Return Me.Celsius.ToString("N2", provider) & "°C"
         Case Else
            Throw New FormatException(String.Format("The '{0}' format string is not supported.", format))
      End Select      
   End Function
End Class

次の例では、 Temperature オブジェクトをインスタンス化しています。The following example instantiates a Temperature object. その後、 ToString メソッドを呼び出し、いくつかの複合書式指定文字列を使用して Temperature オブジェクトのさまざまな文字列形式を取得します。It then calls the ToString method and uses several composite format strings to obtain different string representations of a Temperature object. さらに、それらの各メソッド呼び出しで、 IFormattable クラスの Temperature 実装を呼び出しています。Each of these method calls, in turn, calls the IFormattable implementation of the Temperature class.

public class Example
{
   public static void Main()
   {
      CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
      Temperature temp = new Temperature(22m);
      Console.WriteLine(Convert.ToString(temp, new CultureInfo("ja-JP")));
      Console.WriteLine("Temperature: {0:K}", temp);
      Console.WriteLine("Temperature: {0:F}", temp);
      Console.WriteLine(String.Format(new CultureInfo("fr-FR"), "Temperature: {0:F}", temp));
   }
}
// The example displays the following output:
//       22.00°C
//       Temperature: 295.15K
//       Temperature: 71.60°F
//       Temperature: 71,60°F
Public Module Example
   Public Sub Main()
      Dim temp As New Temperature(22d)
      CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US")
      Console.WriteLine(Convert.ToString(temp1, New CultureInfo("ja-JP")))
      Console.WriteLine("Temperature: {0:K}", temp)
      Console.WriteLine("Temperature: {0:F}", temp)
      Console.WriteLine(String.Format(New CultureInfo("fr-FR"), "Temperature: {0:F}", temp)) 
   End Sub
End Module
' The example displays the following output:
'       22.00°C
'       Temperature: 295.15K
'       Temperature: 71.60°F
'       Temperature: 71,60°F

複合書式指定Composite Formatting

String.FormatStringBuilder.AppendFormatなどの一部のメソッドでは、複合書式指定がサポートされます。Some methods, such as String.Format and StringBuilder.AppendFormat, support composite formatting. 複合書式指定文字列は一種のテンプレートで、0 個以上のオブジェクトの文字列形式が組み込まれた単一の文字列を返します。A composite format string is a kind of template that returns a single string that incorporates the string representation of zero, one, or more objects. 各オブジェクトは、インデックス付きの書式指定項目によって、複合書式指定文字列で表現されます。Each object is represented in the composite format string by an indexed format item. 書式指定項目のインデックスは、それが表すオブジェクトのメソッドのパラメーター リスト内の位置と対応しています。The index of the format item corresponds to the position of the object that it represents in the method's parameter list. インデックスは 0 から始まります。Indexes are zero-based. たとえば、String.Format メソッドの次のメソッド呼び出しでは、最初の書式指定項目 {0:D}thatDate の文字列形式に、2 番目の書式指定項目 {1}item1 の文字列形式に、3 番目の書式指定項目 {2:C2}item1.Value の文字列形式に置き換えられます。For example, in the following call to the String.Format method, the first format item, {0:D}, is replaced by the string representation of thatDate; the second format item, {1}, is replaced by the string representation of item1; and the third format item, {2:C2}, is replaced by the string representation of item1.Value.

result = String.Format("On {0:d}, the inventory of {1} was worth {2:C2}.", 
                       thatDate, item1, item1.Value);
Console.WriteLine(result);                            
// The example displays output like the following if run on a system
// whose current culture is en-US:
//       On 5/1/2009, the inventory of WidgetA was worth $107.44.
result = String.Format("On {0:d}, the inventory of {1} was worth {2:C2}.", _
                       thatDate, item1, item1.Value)
Console.WriteLine(result)                            
' The example displays output like the following if run on a system
' whose current culture is en-US:
'       On 5/1/2009, the inventory of WidgetA was worth $107.44.

書式項目をそれに対応するオブジェクトの文字列形式に置換することに加えて、書式項目は以下を制御することもできます。In addition to replacing a format item with the string representation of its corresponding object, format items also let you control the following:

  • オブジェクトを文字列として表現する特定の方法 (オブジェクトが IFormattable インターフェイスを実装し、書式文字列をサポートする場合)。The specific way in which an object is represented as a string, if the object implements the IFormattable interface and supports format strings. これは、 : (コロン) 付きの書式項目のインデックスに、有効な書式文字列を続けることによります。You do this by following the format item's index with a : (colon) followed by a valid format string. 前の例では、日付の値を "d" (短い日付のパターン) 書式文字列 ( {0:d}など) を書式設定し、数値を "C2" 書式文字列 ( {2:C2} など) で書式設定して数値を 2 桁の小数部を含む 10 進数を持つ通貨値で表していました。The previous example did this by formatting a date value with the "d" (short date pattern) format string (e.g., {0:d}) and by formatting a numeric value with the "C2" format string (e.g., {2:C2} to represent the number as a currency value with two fractional decimal digits.

  • オブジェクトの文字列形式を含むフィールドの幅、およびそのフィールドの文字列形式の配置。The width of the field that contains the object's string representation, and the alignment of the string representation in that field. これは、 , (コンマ) 付きの書式項目のインデックスに、フィールドの幅を続けることによります。You do this by following the format item's index with a , (comma) followed the field width. フィールドの幅が正の値の場合、文字列はフィールドで右揃えにし、フィールドの幅が負の値の場合、左揃えにします。The string is right-aligned in the field if the field width is a positive value, and it is left-aligned if the field width is a negative value. 次の例では、20 文字のフィールドで日付の値を左揃えにし、11 文字のフィールドで、1 桁の小数部を含む 10 進数値を右揃えにします。The following example left-aligns date values in a 20-character field, and it right-aligns decimal values with one fractional digit in an 11-character field.

    DateTime startDate = new DateTime(2015, 8, 28, 6, 0, 0);
    decimal[] temps = { 73.452m, 68.98m, 72.6m, 69.24563m,
                       74.1m, 72.156m, 72.228m };
    Console.WriteLine("{0,-20} {1,11}\n", "Date", "Temperature");
    for (int ctr = 0; ctr < temps.Length; ctr++)
       Console.WriteLine("{0,-20:g} {1,11:N1}", startDate.AddDays(ctr), temps[ctr]);
    
    // The example displays the following output:
    //       Date                 Temperature
    //
    //       8/28/2015 6:00 AM           73.5
    //       8/29/2015 6:00 AM           69.0
    //       8/30/2015 6:00 AM           72.6
    //       8/31/2015 6:00 AM           69.2
    //       9/1/2015 6:00 AM            74.1
    //       9/2/2015 6:00 AM            72.2
    //       9/3/2015 6:00 AM            72.2
    
    Dim startDate As New Date(2015, 8, 28, 6, 0, 0)
    Dim temps() As Decimal = { 73.452, 68.98, 72.6, 69.24563,
                               74.1, 72.156, 72.228 }
    Console.WriteLine("{0,-20} {1,11}", "Date", "Temperature")
    Console.WriteLine()
    For ctr As Integer = 0 To temps.Length - 1
       Console.WriteLine("{0,-20:g} {1,11:N1}", startDate.AddDays(ctr), temps(ctr))
    Next
    ' The example displays the following output:
    '       Date                 Temperature
    '
    '       8/28/2015 6:00 AM           73.5
    '       8/29/2015 6:00 AM           69.0
    '       8/30/2015 6:00 AM           72.6
    '       8/31/2015 6:00 AM           69.2
    '       9/1/2015 6:00 AM            74.1
    '       9/2/2015 6:00 AM            72.2
    '       9/3/2015 6:00 AM            72.2
    

    配置文字列コンポーネントと書式文字列コンポーネントの両方が存在する場合、前者は後者の前にきます (たとえば {0,-20:g})。Note that, if both the alignment string component and the format string component are present, the former precedes the latter (for example, {0,-20:g}.

複合書式指定の詳細については、「 Composite Formatting」を参照してください。For more information about composite formatting, see Composite Formatting.

ICustomFormatter を使用したカスタム書式設定Custom Formatting with ICustomFormatter

String.Format(IFormatProvider, String, Object[]) および StringBuilder.AppendFormat(IFormatProvider, String, Object[])の 2 つの複合書式指定メソッドには、カスタム書式設定をサポートしている書式プロバイダー パラメーターが含まれています。Two composite formatting methods, String.Format(IFormatProvider, String, Object[]) and StringBuilder.AppendFormat(IFormatProvider, String, Object[]), include a format provider parameter that supports custom formatting. これらの書式指定メソッドのいずれかを呼び出すと、書式プロバイダーの Type メソッドに ICustomFormatter インターフェイスを表す GetFormat オブジェクトが渡されます。When either of these formatting methods is called, it passes a Type object that represents an ICustomFormatter interface to the format provider’s GetFormat method. 次に、 GetFormat メソッドによって、カスタム書式設定を提供する ICustomFormatter の実装が返されます。The GetFormat method is then responsible for returning the ICustomFormatter implementation that provides custom formatting.

ICustomFormatter インターフェイスには、 Format(String, Object, IFormatProvider)という単一のメソッドがあります。このメソッドは、複合書式指定文字列の書式指定項目ごとに 1 回、複合書式指定メソッドによって自動的に呼び出されます。The ICustomFormatter interface has a single method, Format(String, Object, IFormatProvider), that is called automatically by a composite formatting method, once for each format item in a composite format string. Format(String, Object, IFormatProvider) メソッドには、3 つのパラメーターがあります。書式指定項目の formatString 引数を表す書式指定文字列、書式を設定するオブジェクト、および書式指定サービスを提供する IFormatProvider オブジェクトの 3 つです。The Format(String, Object, IFormatProvider) method has three parameters: a format string, which represents the formatString argument in a format item, an object to format, and an IFormatProvider object that provides formatting services. 通常は、 ICustomFormatter を実装するクラスでは IFormatProviderも実装するため、この最後のパラメーターはカスタム書式指定クラス自体への参照になります。Typically, the class that implements ICustomFormatter also implements IFormatProvider, so this last parameter is a reference to the custom formatting class itself. このメソッドは、書式を設定するオブジェクトのカスタム書式の文字列形式を返します。The method returns a custom formatted string representation of the object to be formatted. オブジェクトの書式を設定できない場合は、null 参照 (Visual Basic の場合はNothing ) を返します。If the method cannot format the object, it should return a null reference (Nothing in Visual Basic).

整数値を 2 桁の 16 進値とそれに続く 1 つの空白のシーケンスとして表示する、 ICustomFormatter という名前の ByteByByteFormatter の実装の例を次に示します。The following example provides an ICustomFormatter implementation named ByteByByteFormatter that displays integer values as a sequence of two-digit hexadecimal values followed by a space.

public class ByteByByteFormatter : 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 (! formatProvider.Equals(this)) return null;
      
      // Handle only hexadecimal format string.
      if (! format.StartsWith("X")) return null;
      
      byte[] bytes;
      string output = null;
      
      // Handle only integral types.
      if (arg is Byte) 
         bytes = BitConverter.GetBytes((Byte) arg);
      else if (arg is Int16)
         bytes = BitConverter.GetBytes((Int16) arg);
      else if (arg is Int32)
         bytes = BitConverter.GetBytes((Int32) arg);
      else if (arg is Int64)   
         bytes = BitConverter.GetBytes((Int64) arg);
      else if (arg is SByte)
         bytes = BitConverter.GetBytes((SByte) arg);
      else if (arg is UInt16)
         bytes = BitConverter.GetBytes((UInt16) arg);
      else if (arg is UInt32)
         bytes = BitConverter.GetBytes((UInt32) arg);
      else if (arg is UInt64)
         bytes = BitConverter.GetBytes((UInt64) arg);
      else
         return null;

      for (int ctr = bytes.Length - 1; ctr >= 0; ctr--)
         output += String.Format("{0:X2} ", bytes[ctr]);   
      
      return output.Trim();
   }
}
Public Class ByteByByteFormatter : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(formatType As Type) As Object _
                   Implements IFormatProvider.GetFormat
      If formatType Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, arg As Object, 
                          formatProvider As IFormatProvider) As String _
                          Implements ICustomFormatter.Format

      If Not formatProvider.Equals(Me) Then Return Nothing

      ' Handle only hexadecimal format string.
      If Not fmt.StartsWith("X") Then 
            Return Nothing
      End If

      ' Handle only integral types.
      If Not typeof arg Is Byte AndAlso
         Not typeof arg Is Int16 AndAlso
         Not typeof arg Is Int32 AndAlso
         Not typeof arg Is Int64 AndAlso
         Not typeof arg Is SByte AndAlso
         Not typeof arg Is UInt16 AndAlso
         Not typeof arg Is UInt32 AndAlso
         Not typeof arg Is UInt64 Then _
            Return Nothing

      Dim bytes() As Byte = BitConverter.GetBytes(arg)
      Dim output As String = Nothing
         
      For ctr As Integer = bytes.Length - 1 To 0 Step -1
         output += String.Format("{0:X2} ", bytes(ctr))   
      Next
      
      Return output.Trim()
   End Function
End Class

ByteByByteFormatter クラスを使用して整数値の書式を設定する例を次に示します。The following example uses the ByteByByteFormatter class to format integer values. サンプルでは、 ICustomFormatter.Format メソッドが 2 回目の String.Format(IFormatProvider, String, Object[]) メソッド呼び出しで複数回呼び出されることに注意してください。また、 NumberFormatInfo メソッドが "N0" 書式指定文字列を認識せず、null 参照 (Visual Basic の場合はByteByByteFormatter.FormatNote that the ICustomFormatter.Format method is called more than once in the second String.Format(IFormatProvider, String, Object[]) method call, and that the default NumberFormatInfo provider is used in the third method call because the .ByteByByteFormatter.Format ) を返すため、3 回目のメソッド呼び出しでは既定のNothing ) に相当する書式指定子。method does not recognize the "N0" format string and returns a null reference (Nothing in Visual Basic).

public class Example
{
   public static void Main()
   {
      long value = 3210662321; 
      byte value1 = 214;
      byte value2 = 19;
      
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0:X}", value));
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0:X} And {1:X} = {2:X} ({2:000})", 
                                      value1, value2, value1 & value2));                                
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0,10:N0}", value));
   }
}
// The example displays the following output:
//       00 00 00 00 BF 5E D1 B1
//       00 D6 And 00 13 = 00 12 (018)
//       3,210,662,321
Public Module Example
   Public Sub Main()
      Dim value As Long = 3210662321 
      Dim value1 As Byte = 214
      Dim value2 As Byte = 19
      
      Console.WriteLine((String.Format(New ByteByByteFormatter(), "{0:X}", value)))
      Console.WriteLine((String.Format(New ByteByByteFormatter(), "{0:X} And {1:X} = {2:X} ({2:000})", 
                                      value1, value2, value1 And value2)))                                
      Console.WriteLine(String.Format(New ByteByByteFormatter(), "{0,10:N0}", value))
   End Sub
End Module
' The example displays the following output:
'       00 00 00 00 BF 5E D1 B1
'       00 D6 And 00 13 = 00 12 (018)
'       3,210,662,321

TitleTitle 定義Definition
Standard Numeric Format StringsStandard Numeric Format Strings 数値に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of numeric values.
Custom Numeric Format StringsCustom Numeric Format Strings 数値に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for numeric values.
Standard Date and Time Format StringsStandard Date and Time Format Strings DateTime 値に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of DateTime values.
Custom Date and Time Format StringsCustom Date and Time Format Strings DateTime 値に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for DateTime values.
標準の時間間隔書式指定文字列Standard TimeSpan Format Strings 時間間隔に対して一般的に使用される文字列形式を作成する標準書式指定文字列について説明します。Describes standard format strings that create commonly used string representations of time intervals.
カスタム時間間隔書式指定文字列Custom TimeSpan Format Strings 時間間隔に対するアプリケーション固有の文字列形式を作成するカスタム書式指定文字列について説明します。Describes custom format strings that create application-specific formats for time intervals.
Enumeration Format StringsEnumeration Format Strings 列挙型の文字列形式を作成するために使用される標準書式指定文字列について説明します。Describes standard format strings that are used to create string representations of enumeration values.
複合書式指定Composite Formatting 文字列に 1 つ以上の書式指定された値を埋め込む方法について説明します。Describes how to embed one or more formatted values in a string. この文字列は、コンソールに表示したり、ストリームに書き込んだりできます。The string can subsequently be displayed on the console or written to a stream.
書式設定操作の実行Performing Formatting Operations 特定の書式設定操作を行うための手順を説明するトピックの一覧を示します。Lists topics that provide step-by-step instructions for performing specific formatting operations.
Parsing StringsParsing Strings オブジェクトの文字列表現によって指定された値にオブジェクトを初期化する方法について説明します。Describes how to initialize objects to the values described by string representations of those objects. 解析は書式設定の逆の操作です。Parsing is the inverse operation of formatting.

関連項目Reference