Gambaran umum: Cara memformat angka, tanggal, enum, dan jenis lainnya di .NET

Pemformatan adalah proses mengonversi instans kelas atau struktur, atau nilai enumerasi, menjadi representasi string. Tujuannya adalah untuk menampilkan string yang dihasilkan kepada pengguna atau untuk mendeserialisasikannya nanti untuk memulihkan jenis data asli. Artikel ini memperkenalkan mekanisme pemformatan yang disediakan .NET.

Catatan

Penguraian adalah inversi pemformatan. Operasi penguraian membuat instans jenis data dari representasi stringnya. Untuk informasi selengkapnya, lihat Mengurai String. Untuk informasi selengkapnya tentang serialisasi dan deserialisasi di .NET, lihat Serialisasi di .NET.

Mekanisme dasar untuk pemformatan adalah implementasi Object.ToString default metode, yang dibahas di bagian Pemformatan Default Menggunakan Metode ToString nanti dalam topik ini. Namun, .NET menyediakan beberapa cara untuk memodifikasi dan memperluas dukungan pemformatan defaultnya. Manfaatnya meliputi:

  • Mengesampingkan Object.ToString metode untuk menentukan representasi string kustom dari nilai objek. Untuk informasi selengkapnya, lihat bagian Mengambil alih Metode ToString nanti dalam topik ini.

  • Menentukan penentu format yang memungkinkan representasi string dari nilai objek untuk mengambil beberapa formulir. Misalnya, penentu format "X" dalam pernyataan berikut mengonversi bilangan bulat ke representasi string dari nilai heksadesimal.

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

    Untuk informasi selengkapnya tentang penentu format, lihat bagian Metode ToString dan String Format.

  • Menggunakan penyedia format untuk mengimplementasikan konvensi pemformatan dari budaya tertentu. Misalnya, pernyataan berikut menampilkan nilai mata uang dengan menggunakan konvensi pemformatan budaya en-US.

    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
    

    Untuk informasi selengkapnya tentang pemformatan dengan penyedia format, lihat bagian Penyedia Format.

  • Menerapkan IFormattable antarmuka untuk mendukung konversi string dengan Convert kelas dan pemformatan komposit. Untuk informasi selengkapnya, lihat bagian Antarmuka IConvertible.

  • Menggunakan pemformatan komposit untuk menyematkan representasi string nilai dalam string yang lebih besar. Untuk informasi selengkapnya, lihat bagian Pemformatan Komposit.

  • Menggunakan interpolasi string, sintaks yang lebih mudah dibaca untuk menyematkan representasi string nilai dalam string yang lebih besar. Untuk informasi selengkapnya, lihat Interpolasi string.

  • Menerapkan ICustomFormatter dan IFormatProvider menyediakan solusi pemformatan kustom lengkap. Untuk informasi selengkapnya, lihat bagian Pemformatan Kustom dengan ICustomFormatter.

Bagian berikut memeriksa metode ini untuk mengonversi objek ke representasi stringnya.

Pemformatan default menggunakan metode ToString

Setiap jenis yang berasal dari System.Object secara otomatis mewarisi metode tanpa ToString parameter, yang mengembalikan nama jenis secara default. Contoh berikut mengilustrasikan metode default ToString. Ini mendefinisikan kelas bernama Automobile yang tidak memiliki implementasi. Ketika kelas dibuat dan metodenya ToString dipanggil, kelas akan menampilkan nama jenisnya. Perhatikan bahwa ToString metode ini tidak secara eksplisit dipanggil dalam contoh. Metode ini Console.WriteLine(Object) secara implisit ToString memanggil metode objek yang diteruskan ke dalamnya sebagai argumen.

using System;

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

public class Example9
{
   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 Example9
    Public Sub Main9()
        Dim firstAuto As New Automobile()
        Console.WriteLine(firstAuto)
    End Sub
End Module
' The example displays the following output:
'       Automobile

Peringatan

Dimulai dengan Windows 8.1, Windows Runtime menyertakan IStringable antarmuka dengan satu metode, IStringable.ToString, yang menyediakan dukungan pemformatan default. Namun, kami menyarankan agar jenis terkelola tidak mengimplementasikan IStringable antarmuka. Untuk informasi selengkapnya, lihat bagian "Windows Runtime dan IStringable Antarmuka" di Object.ToString halaman referensi.

Karena semua jenis selain antarmuka berasal dari Object, fungsionalitas ini secara otomatis disediakan untuk kelas atau struktur kustom Anda. Namun, fungsionalitas yang ditawarkan oleh metode default ToString, terbatas: Meskipun mengidentifikasi jenisnya, fungsi ini gagal memberikan informasi apa pun tentang instans jenis. Untuk memberikan representasi string objek yang menyediakan informasi tentang objek tersebut ToString, Anda harus mengambil alih metode.

Catatan

Struktur mewarisi dari ValueType, yang pada gilirannya berasal dari Object. Meskipun ValueType mengambil alih Object.ToString, implementasinya identik.

Cara mengambil alih metode ToString

Menampilkan nama jenis sering kali memiliki penggunaan terbatas dan tidak memungkinkan konsumen dari jenis Anda membedakan satu instans dari instans lain. Namun, Anda dapat mengambil ToString alih metode untuk memberikan representasi yang lebih berguna dari nilai objek. Contoh berikut mendefinisikan Temperature objek dan mengambil alih metodenya ToString untuk menampilkan suhu dalam derajat Celcius.

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 Example12
{
    public static void Main()
    {
        Temperature currentTemperature = new Temperature(23.6m);
        Console.WriteLine($"The current temperature is {currentTemperature}");
    }
}
// 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 Example13
    Public Sub Main13()
        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.

Dalam .NET, ToString metode dari setiap jenis nilai primitif telah diganti untuk menampilkan nilai objek bukan namanya. Tabel berikut menunjukkan penggantian untuk setiap jenis primitif. Perhatikan bahwa sebagian besar metode yang diganti memanggil kelebihan lain dari ToString metode dan meneruskannya dengan penentu format "G", yang mendefinisikan format umum untuk jenisnya, dan IFormatProvider objek yang mewakili budaya saat ini.

Jenis penggantian ToString
Boolean Mengembalikan baik Boolean.TrueString atau Boolean.FalseString.
Byte Panggilan Byte.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Byte nilai untuk budaya saat ini.
Char Mengembalikan karakter sebagai string.
DateTime Panggilan DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo) untuk memformat nilai tanggal dan waktu untuk budaya saat ini.
Decimal Panggilan Decimal.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Decimal nilai untuk budaya saat ini.
Double Panggilan Double.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Double nilai untuk budaya saat ini.
Int16 Panggilan Int16.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Int16 nilai untuk budaya saat ini.
Int32 Panggilan Int32.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Int32 nilai untuk budaya saat ini.
Int64 Panggilan Int64.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Int64 nilai untuk budaya saat ini.
SByte Panggilan SByte.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat SByte nilai untuk budaya saat ini.
Single Panggilan Single.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat Single nilai untuk budaya saat ini.
UInt16 Panggilan UInt16.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat UInt16 nilai untuk budaya saat ini.
UInt32 Panggilan UInt32.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat UInt32 nilai untuk budaya saat ini.
UInt64 Panggilan UInt64.ToString("G", NumberFormatInfo.CurrentInfo) untuk memformat UInt64 nilai untuk budaya saat ini.

Metode ToString dan string format

Mengandalkan metode default ToString atau penggantian ToString sesuai ketika objek memiliki representasi string tunggal. Namun, nilai objek sering memiliki beberapa representasi. Misalnya, suhu dapat diekspresikan dalam derajat Fahrenheit, derajat Celcius, atau kelvin. Demikian pula, nilai bilangan bulat 10 dapat diwakili dalam berbagai cara, termasuk 10, 10,0, 1,0e01, atau $10,00.

Untuk mengaktifkan satu nilai agar memiliki beberapa representasi string, .NET menggunakan string format. String format adalah string yang berisi satu atau beberapa penentu format yang telah ditentukan sebelumnya, yang merupakan karakter tunggal atau grup karakter yang menentukan bagaimana ToString metode harus memformat outputnya. String format kemudian diteruskan sebagai parameter ke metode objek ToString dan menentukan bagaimana representasi string dari nilai objek tersebut akan muncul.

Semua jenis numerik, jenis tanggal dan waktu, dan jenis enumerasi di .NET mendukung serangkaian penentu format yang telah ditentukan sebelumnya. Anda juga dapat menggunakan string format untuk menentukan beberapa representasi string dari jenis data yang ditentukan aplikasi Anda.

String format standar

String format standar berisi penentu format tunggal, yang merupakan karakter alfabet yang menentukan representasi string objek yang diterapkannya, bersama dengan penentu presisi opsional yang memengaruhi berapa banyak digit yang ditampilkan dalam string hasil. Jika penentu presisi dihilangkan atau tidak didukung, penentu format standar setara dengan string format standar.

.NET mendefinisikan sekumpulan penentu format standar untuk semua jenis numerik, semua jenis tanggal dan waktu, dan semua jenis enumerasi. Misalnya, masing-masing kategori ini mendukung penentu format standar "G", yang menentukan representasi string umum dari nilai jenis tersebut.

String format standar untuk jenis enumerasi secara langsung mengontrol representasi string dari nilai. String format yang diteruskan ke metode ToString nilai enumerasi menentukan apakah nilai ditampilkan menggunakan nama stringnya (penentu format "G" dan "F"), nilai integral yang mendasar (penentu format "D"), atau nilai heksadesimalnya (penentu format "X"). Contoh berikut mengilustrasikan penggunaan string format standar untuk memformat DayOfWeek nilai enumerasi.

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

Untuk informasi tentang string format enumerasi, lihat String Format Enumerasi.

String format standar untuk jenis numerik biasanya menentukan string hasil yang tampilannya tepat dikontrol oleh satu atau beberapa nilai properti. Misalnya, penentu format "C" memformat angka sebagai nilai mata uang. Saat Anda memanggil ToString metode dengan penentu format "C" sebagai satu-satunya parameter, nilai properti berikut dari objek budaya NumberFormatInfo saat ini digunakan untuk menentukan representasi string dari nilai numerik:

  • Properti CurrencySymbol, yang menentukan simbol mata uang budaya saat ini.

  • Properti CurrencyNegativePattern atau CurrencyPositivePattern, yang mengembalikan bilangan bulat yang menentukan hal berikut:

    • Penempatan simbol mata uang.

    • Apakah nilai negatif ditunjukkan oleh tanda negatif di depannya, tanda negatif berikutnya, atau tanda kurung.

    • Apakah spasi muncul antara nilai numerik dan simbol mata uang.

  • Properti CurrencyDecimalDigits, yang menentukan jumlah digit pecahan dalam string hasil.

  • Properti CurrencyDecimalSeparator, yang menentukan simbol pemisah desimal dalam string hasil.

  • Properti CurrencyGroupSeparator, yang menentukan simbol pemisah grup.

  • Properti CurrencyGroupSizes, yang menentukan jumlah digit di setiap grup di sebelah kiri desimal.

  • Properti NegativeSign, yang menentukan tanda negatif yang digunakan dalam string hasil jika tanda kurung tidak digunakan untuk menunjukkan nilai negatif.

Selain itu, string format numerik dapat menyertakan penentu presisi. Arti dari penentu ini tergantung pada string format yang digunakan, tetapi biasanya menunjukkan jumlah total digit atau jumlah digit pecahan yang akan muncul dalam string hasil. Misalnya, contoh berikut menggunakan string numerik standar "X4" dan penentu presisi untuk membuat nilai string yang memiliki empat digit heksadesimal.

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

Untuk informasi selengkapnya tentang string pemformatan numerik standar, lihat String Format Numerik Standar.

String format standar untuk nilai tanggal dan waktu adalah alias untuk string format kustom yang disimpan oleh DateTimeFormatInfo properti tertentu. Misalnya, memanggil ToString metode nilai tanggal dan waktu dengan penentu format "D" menampilkan tanggal dan waktu dengan menggunakan string format kustom yang disimpan di properti budaya DateTimeFormatInfo.LongDatePattern saat ini. (Untuk informasi selengkapnya tentang string format kustom, lihat bagian berikutnya.) Contoh berikut mengilustrasikan hubungan ini.

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 Main0()
        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

Untuk informasi selengkapnya tentang string format tanggal dan waktu standar, lihat String Format Tanggal dan Waktu Standar.

Anda juga dapat menggunakan string format standar untuk menentukan representasi string objek yang ditentukan aplikasi yang dihasilkan oleh metode objek ToString(String). Anda dapat menentukan penentu format standar tertentu yang didukung objek Anda, dan Anda dapat menentukan apakah penentunya peka huruf besar/kecil atau tidak peka huruf besar/kecil. Implementasi ToString(String) metode Anda harus mendukung hal-hal berikut:

  • Penentu format "G" yang mewakili format objek yang biasa atau umum. Kelebihan parameter metode objek ToString Anda harus memanggil kelebihan bebannya ToString(String) dan meneruskannya string format standar "G".

  • Dukungan untuk penentu format yang sama dengan referensi null (Nothing dalam Visual Basic). Penentu format yang sama dengan referensi null harus dianggap setara dengan penentu format "G".

Misalnya, kelas Temperature dapat menyimpan suhu secara internal dalam derajat Celcius dan menggunakan penentu format untuk mewakili nilai Temperature objek dalam derajat Celcius, derajat Fahrenheit, dan kelvin. Contoh berikut memberikan ilustrasi.

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 Example1
{
   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 Example1
    Public Sub Main1()
        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.

String format kustom

Selain string format standar, .NET menentukan string format kustom untuk nilai numerik dan nilai tanggal dan waktu. String format kustom terdiri dari satu atau beberapa penentu format kustom yang menentukan representasi string dari nilai. Misalnya, string format tanggal dan waktu kustom "yyyy/mm/dd hh:mm:ss.ffff t zzz" mengonversi tanggal ke representasi stringnya dalam formulir "2008/11/15 07:45:00.0000 P -08:00" untuk budaya en-US. Demikian pula, string format kustom "0000" mengonversi nilai bilangan bulat 12 menjadi "0012". Untuk daftar lengkap string format kustom, lihat String Format Tanggal dan Waktu Kustom dan String Format Numerik Kustom.

Jika string format terdiri dari penentu format kustom tunggal, penentu format harus didahului oleh simbol persen (%) untuk menghindari kebingungan dengan penentu format standar. Contoh berikut menggunakan penentu format kustom "M" untuk menampilkan angka satu digit atau dua digit bulan dari tanggal tertentu.

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

Banyak string format standar untuk nilai tanggal dan waktu adalah alias untuk string format kustom yang ditentukan oleh properti DateTimeFormatInfo objek. String format kustom juga menawarkan fleksibilitas yang cukup besar dalam menyediakan pemformatan yang ditentukan aplikasi untuk nilai numerik atau nilai tanggal dan waktu. Anda dapat menentukan string hasil kustom Anda sendiri untuk nilai numerik dan nilai tanggal dan waktu dengan menggabungkan beberapa penentu format kustom ke dalam satu string format kustom. Contoh berikut menentukan string format kustom yang menampilkan hari dalam seminggu dalam tanda kurung setelah nama bulan, hari, dan tahun.

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)      

Contoh berikut mendefinisikan string format kustom yang menampilkan Int64 nilai sebagai nomor telepon A.S. tujuh digit standar bersama dengan kode areanya.

using System;

public class Example17
{
   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 Example18
    Public Sub Main18()
        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

Meskipun string format standar umumnya dapat menangani sebagian besar kebutuhan pemformatan untuk jenis yang ditentukan aplikasi, Anda juga dapat menentukan penentu format kustom untuk memformat jenis Anda.

Format string dan jenis .NET

Semua jenis numerik (yaitu Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64, dan BigInteger jenis), serta DateTime, DateTimeOffset, TimeSpan, Guid, dan semua jenis enumerasi, mendukung pemformatan dengan string format. Untuk informasi tentang string format tertentu yang didukung oleh setiap jenis, lihat topik berikut:

Judul Definisi
String Format Numerik Standar Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari nilai numerik.
String Format Numerik Kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk nilai numerik.
String Format Tanggal dan Waktu Standar Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari DateTimenilai DateTimeOffset.
String Format Tanggal dan Waktu Kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk DateTime dan DateTimeOffset nilai.
String format TimeSpan kustom Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari nilai numerik.
String format TimeSpan kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk nilai numerik.
String format enumerasi Menjelaskan string format standar yang digunakan untuk membuat representasi string dari nilai enumerasi.
Guid.ToString(String) Menjelaskan string format standar untuk Guid nilai.

Pemformatan sensitif budaya dengan penyedia format

Meskipun penentu format memungkinkan Anda menyesuaikan pemformatan objek, menghasilkan representasi string objek yang bermakna sering memerlukan informasi pemformatan tambahan. Misalnya, memformat angka sebagai nilai mata uang dengan menggunakan string format standar "C" atau string format kustom seperti "$ #,#.00" mengharuskan, minimal, informasi tentang simbol mata uang yang benar, pemisah grup, dan pemisah desimal untuk tersedia untuk disertakan dalam string yang diformat. Di .NET, informasi pemformatan tambahan ini tersedia melalui IFormatProvider antarmuka, yang disediakan sebagai parameter untuk satu atau beberapa kelebihan dari ToString metode jenis numerik dan jenis tanggal dan waktu. IFormatProvider implementasi digunakan dalam .NET untuk mendukung pemformatan khusus budaya. Contoh berikut menggambarkan bagaimana representasi string objek berubah saat diformat dengan tiga IFormatProvider objek yang mewakili budaya yang berbeda.

using System;
using System.Globalization;

public class Example18
{
   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 Example11
    Public Sub Main11()
        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 €

Antarmuka IFormatProvider mencakup satu metode, GetFormat(Type), yang memiliki satu parameter yang menentukan jenis objek yang menyediakan informasi pemformatan. Jika metode dapat memberikan objek dari jenis tersebut, metode akan mengembalikannya. Jika tidak, ia mengembalikan referensi null (Nothing dalam Visual Basic).

IFormatProvider.GetFormat adalah metode panggilan balik. Saat Anda memanggil metode kelebihan ToString beban yang menyertakan IFormatProvider parameter, metode ini memanggil metode GetFormat objek tersebutIFormatProvider. Metode GetFormat ini bertanggung jawab untuk mengembalikan objek yang menyediakan informasi pemformatan yang diperlukan, seperti yang ditentukan oleh parameternya formatType, ke ToString metode.

Sejumlah metode pemformatan atau konversi string menyertakan parameter jenis IFormatProvider, tetapi dalam banyak kasus nilai parameter diabaikan saat metode dipanggil. Tabel berikut mencantumkan beberapa metode pemformatan yang menggunakan parameter dan jenis Type objek yang diteruskan ke IFormatProvider.GetFormat metode.

Metode Jenis formatType parameter
ToString metode jenis numerik System.Globalization.NumberFormatInfo
ToString metode jenis tanggal dan waktu System.Globalization.DateTimeFormatInfo
String.Format System.ICustomFormatter
StringBuilder.AppendFormat System.ICustomFormatter

Catatan

Metode ToString jenis numerik dan jenis tanggal dan waktu kelebihan beban, dan hanya beberapa kelebihan beban yang IFormatProvider menyertakan parameter. Jika metode tidak memiliki parameter jenis IFormatProvider, objek yang dikembalikan oleh CultureInfo.CurrentCulture properti akan diteruskan sebagai gantinya. Misalnya, panggilan ke metode default Int32.ToString() pada akhirnya menghasilkan panggilan metode seperti berikut: Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture).

.NET menyediakan tiga kelas yang mengimplementasikan IFormatProvider:

Anda juga dapat menerapkan penyedia format Anda sendiri untuk mengganti salah satu kelas ini. Namun, metode implementasi GetFormat Anda harus mengembalikan objek jenis yang tercantum dalam tabel sebelumnya jika harus memberikan informasi pemformatan ke ToString metode.

Pemformatan nilai numerik yang sensitif terhadap budaya

Secara default, pemformatan nilai numerik peka terhadap budaya. Jika Anda tidak menentukan budaya saat memanggil metode pemformatan, konvensi pemformatan dari budaya saat ini digunakan. Ini diilustrasikan dalam contoh berikut, yang mengubah budaya saat ini empat kali dan kemudian memanggil Decimal.ToString(String) metode. Dalam setiap kasus, string hasil mencerminkan konvensi pemformatan dari budaya saat ini. Ini karena ToString metode dan ToString(String) membungkus panggilan ke setiap metode jenis ToString(String, IFormatProvider) numerik.

using System.Globalization;

public class Example6
{
   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 culture.
         CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine($"The current culture is {CultureInfo.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

Module Example6
    Public Sub Main6()
        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 culture.
            CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
            Console.WriteLine($"The current culture is {CultureInfo.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 €

Anda juga dapat memformat nilai numerik untuk budaya tertentu dengan memanggil ToString kelebihan beban yang memiliki provider parameter dan meneruskannya salah satu hal berikut:

Contoh berikut menggunakan NumberFormatInfo objek yang mewakili budaya Inggris (Amerika Serikat) dan Inggris (Inggris) dan budaya netral Prancis dan Rusia untuk memformat angka floating-point.

using System.Globalization;

public class Example7
{
    public static void Main()
    {
        double value = 1043.62957;
        string[] cultureNames = { "en-US", "en-GB", "ru", "fr" };

        foreach (string? 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 Example7
    Public Sub Main7()
        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

Pemformatan nilai tanggal dan waktu yang sensitif terhadap budaya

Secara default, pemformatan nilai numerik peka terhadap budaya. Jika Anda tidak menentukan budaya saat memanggil metode pemformatan, konvensi pemformatan dari budaya saat ini digunakan. Ini diilustrasikan dalam contoh berikut, yang mengubah budaya saat ini empat kali dan kemudian memanggil DateTime.ToString(String) metode. Dalam setiap kasus, string hasil mencerminkan konvensi pemformatan dari budaya saat ini. Ini karena DateTime.ToString()metode, DateTime.ToString(String), DateTimeOffset.ToString(), dan DateTimeOffset.ToString(String) membungkus panggilan ke DateTime.ToString(String, IFormatProvider) metode dan DateTimeOffset.ToString(String, IFormatProvider).

using System.Globalization;

public class Example4
{
   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 culture.
         CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine($"The current culture is {CultureInfo.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 Example4
    Public Sub Main4()
        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 culture.
            CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
            Console.WriteLine($"The current culture is {CultureInfo.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 

Anda juga dapat memformat nilai numerik untuk budaya tertentu dengan memanggil DateTime.ToString atau DateTimeOffset.ToString kelebihan beban yang memiliki provider parameter dan meneruskannya salah satu hal berikut:

Contoh berikut menggunakan DateTimeFormatInfo objek yang mewakili budaya Inggris (Amerika Serikat) dan Inggris (Inggris) dan budaya netral Prancis dan Rusia untuk memformat tanggal.

using System.Globalization;

public class Example5
{
   public static void Main()
   {
      DateTime dat1 = new(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($"{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 Example5
    Public Sub Main5()
        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($"{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

Antarmuka IFormattable

Biasanya, jenis yang membebani ToString metode dengan string format dan IFormatProvider parameter juga mengimplementasikan IFormattable antarmuka. Antarmuka ini memiliki satu anggota, IFormattable.ToString(String, IFormatProvider), yang mencakup string format dan penyedia format sebagai parameter.

Menerapkan IFormattable antarmuka untuk kelas yang ditentukan aplikasi Anda menawarkan dua keuntungan:

Contoh berikut mendefinisikan Temperature kelas yang mengimplementasikan IFormattable antarmuka. Ini mendukung penentu format "C" atau "G" untuk menampilkan suhu di Celcius, penentu format "F" untuk menampilkan suhu di Fahrenheit, dan penentu format "K" untuk menampilkan suhu di Kelvin.

using System;
using System.Globalization;

namespace HotAndCold
{

    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));
            }
        }
    }
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 '{format}' format string is not supported."))
        End Select
    End Function
End Class

Contoh berikut membuat instans Temperature objek. Kemudian memanggil ToString metode dan menggunakan beberapa string format komposit untuk mendapatkan representasi string objek yang Temperature berbeda. Masing-masing metode ini memanggil, pada gilirannya IFormattable, memanggil implementasi Temperature kelas.

public class Example11
{
    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 Example12
    Public Sub Main12()
        Dim temp As New Temperature(22D)
        CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US")
        Console.WriteLine(Convert.ToString(temp, New CultureInfo("ja-JP")))
        Console.WriteLine($"Temperature: {temp:K}")
        Console.WriteLine($"Temperature: {temp:F}")
        Console.WriteLine(String.Format(New CultureInfo("fr-FR"), $"Temperature: {temp:F}"))
    End Sub
End Module
' The example displays the following output:
'       22.00°C
'       Temperature: 295.15K
'       Temperature: 71.60°F
'       Temperature: 71,60°F

Pemformatan komposit

Beberapa metode, seperti String.Format dan StringBuilder.AppendFormat, mendukung pemformatan komposit. String format komposit adalah jenis templat yang mengembalikan string tunggal yang menggabungkan representasi string nol, satu, atau beberapa objek. Setiap objek diwakili dalam string format komposit oleh item format terindeks. Indeks item format bersesuaian dengan posisi objek yang diwakilinya dalam daftar parameter metode. Indeks berbasis nol. Misalnya, dalam panggilan berikut ke String.Format metode, item format pertama, {0:D}, digantikan oleh representasi thatDatestring; item format kedua, {1}digantikan oleh representasi item1string; dan item format ketiga, {2:C2}, digantikan oleh representasi string 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.

Selain mengganti item format dengan representasi string objek yang sesuai, format item juga memungkinkan Anda mengontrol hal berikut:

  • Cara khusus di mana objek direpresentasikan IFormattable sebagai string, jika objek mengimplementasikan antarmuka dan mendukung string format. Anda melakukan ini dengan mengikuti indeks item format dengan : (titik dua) diikuti dengan string format yang valid. Contoh sebelumnya melakukan ini dengan memformat nilai tanggal dengan string format "d" (pola tanggal pendek) (misalnya, {0:d}) dan dengan memformat nilai numerik dengan string format "C2" (misalnya, {2:C2} untuk mewakili angka sebagai nilai mata uang dengan dua digit desimal pecahan.

  • Lebar bidang yang berisi representasi string objek, dan perataan representasi string di bidang tersebut. Anda melakukan ini dengan mengikuti indeks item format dengan , (koma) mengikuti lebar bidang. String rata kanan di bidang jika lebar bidang adalah nilai positif, dan rata kiri jika lebar bidang adalah nilai negatif. Contoh berikut rata kiri nilai tanggal dalam bidang 20 karakter, dan rata kanan nilai desimal dengan satu digit pecahan dalam bidang 11 karakter.

    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
    

    Perhatikan bahwa, jika komponen string perataan dan komponen string format ada, yang sebelumnya mendahului yang terakhir (misalnya, {0,-20:g}.

Untuk informasi selengkapnya tentang pemformatan komposit, lihat Pemformatan Komposit.

Pemformatan kustom dengan ICustomFormatter

Dua metode pemformatan komposit, String.Format(IFormatProvider, String, Object[]) dan StringBuilder.AppendFormat(IFormatProvider, String, Object[]), sertakan parameter penyedia format yang mendukung pemformatan kustom. Ketika salah satu metode pemformatan ini dipanggil, metode ini meneruskan Type objek yang mewakili ICustomFormatter antarmuka ke metode penyedia GetFormat format. Metode GetFormat ini kemudian bertanggung jawab untuk mengembalikan ICustomFormatter implementasi yang menyediakan pemformatan kustom.

Antarmuka ICustomFormatter memiliki satu metode, Format(String, Object, IFormatProvider), yang dipanggil secara otomatis oleh metode pemformatan komposit, sekali untuk setiap item format dalam string format komposit. Metode Format(String, Object, IFormatProvider) ini memiliki tiga parameter: string format, yang mewakili formatString argumen dalam item format, objek untuk diformat, dan IFormatProvider objek yang menyediakan layanan pemformatan. Biasanya, kelas yang mengimplementasikan juga mengimplementasikan ICustomFormatterIFormatProvider, sehingga parameter terakhir ini adalah referensi ke kelas pemformatan kustom itu sendiri. Metode mengembalikan representasi string terformat kustom dari objek yang akan diformat. Jika metode tidak dapat memformat objek, metode harus mengembalikan referensi null (Nothing dalam Visual Basic).

Contoh berikut menyediakan ICustomFormatter implementasi bernama ByteByByteFormatter yang menampilkan nilai bilangan bulat sebagai urutan nilai heksadesimal dua digit diikuti oleh spasi.

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

Contoh berikut menggunakan ByteByByteFormatter kelas untuk memformat nilai bilangan bulat. Perhatikan bahwa ICustomFormatter.Format metode ini dipanggil lebih dari sekali dalam panggilan metode kedua String.Format(IFormatProvider, String, Object[]), dan bahwa penyedia default NumberFormatInfo digunakan dalam panggilan metode ketiga karena .ByteByByteFormatter.Formatmetode tidak mengenali string format "N0" dan mengembalikan referensi null (Nothing dalam Visual Basic).

public class Example10
{
   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 Example10
    Public Sub Main10()
        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

Lihat juga

Judul Definisi
String Format Numerik Standar Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari nilai numerik.
String Format Numerik Kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk nilai numerik.
String Format Tanggal dan Waktu Standar Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari DateTime nilai.
String Format Tanggal dan Waktu Kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk DateTime nilai.
String format TimeSpan kustom Menjelaskan string format standar yang membuat representasi string yang umum digunakan dari nilai numerik.
String format TimeSpan kustom Menjelaskan string format kustom yang membuat format khusus aplikasi untuk nilai numerik.
String format enumerasi Menjelaskan string format standar yang digunakan untuk membuat representasi string dari nilai enumerasi.
Pemformatan Komposit Menjelaskan cara menyematkan satu atau beberapa nilai yang diformat dalam string. String kemudian dapat ditampilkan di konsol atau ditulis ke streaming.
Mengurai string Menjelaskan cara menginisialisasi objek ke nilai yang dijelaskan oleh representasi string objek tersebut. Penguraian adalah operasi terbalik dari pemformatan.

Referensi