Bileşik biçimlendirme

.NET bileşik biçimlendirme özelliği, nesnelerin listesini ve bileşik biçim dizesini giriş olarak alır. Bileşik biçim dizesi, biçim öğeleri olarak adlandırılan dizinlenmiş yer tutucularla karıştırılan sabit metinlerden oluşur. Bu biçim öğeleri listedeki nesnelere karşılık gelir. Biçimlendirme işlemi sonuç olarak, orijinal sabit metin ve listedeki nesnelerin dize temsillerinin karışımından oluşan bir dize oluşturur.

Önemli

Bileşik biçim dizeleri kullanmak yerine, kullandığınız dil ve sürümü bunları destekliyorsa, ilişkilendirilmiş dizeleri kullanabilirsiniz. İlişkili bir dize, ilişkilendirilmiş ifadeler içerir. İlişkili her ifade, ifadenin değeriyle çözümlenir ve dize atandığında sonuç dizesine eklenir. Daha fazla bilgi için bkz . Dize ilişkilendirmesi (C# Başvurusu) ve İlişkili dizeler (Visual Basic Başvurusu).

Aşağıdaki yöntemler bileşik biçimlendirme özelliğini destekler:

Bileşik biçim dizesi

Bileşik biçimlendirme özelliğini destekleyen metotlarda bir bileşik biçimlendirme dizesi ve nesne listesi bağımsız değişkenler olarak kullanılır. Bir bileşik biçimlendirme dizesi sıfır veya daha fazla sabit metin bölümüyle karışık olarak bir veya daha fazla biçim öğesinden oluşur. Sabit metin seçtiğiniz herhangi bir dizedir, ve her biçim öğesi listedeki bir nesneye veya kutulu yapıya karşılık gelir. Her nesnenin dize gösterimi, karşılık gelen biçim öğesinin yerini alır.

Aşağıdaki Format kod parçasını göz önünde bulundurun:

string.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now);
String.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now)

Sabit metin ve , hours = şeklindedirName = . Biçim öğeleri, {0}0 dizini nesnesine karşılık gelen ve {1:hh}1 dizini nesnesine nameDateTime.Nowkarşılık gelen öğeleridir.

Öğe söz dizimlerini biçimlendir

Her biçim öğesi aşağıdaki biçimi alır ve aşağıdaki bileşenlerden oluşur:

{index[,alignment][:formatString]}

Eşleşen ayraçlar ({ ve }) gereklidir.

Dizin bileşeni

Parametre tanımlayıcısı olarak da adlandırılan zorunlu dizin bileşeni, nesne listesinde karşılık gelen bir öğeyi tanımlayan 0'dan başlayan bir sayıdır. Diğer bir ifadeyle, parametre belirticisi listedeki ilk nesneyi biçimlendiren biçim öğesidir 0 . Parametre belirticisi 1 listedeki ikinci nesneyi biçimlendiren biçim öğesi vb. Aşağıdaki örnek, 10'dan küçük asal sayıları göstermek için sıfırdan üçe kadar numaralandırılmış dört parametre tanımlayıcısı içerir:

string.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now);
String.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now)

Birden çok biçim öğesi, aynı parametre tanımlayıcısını belirterek nesne listesindeki aynı öğeye başvurabilir. Örneğin, aşağıdaki örnekte gösterildiği gibi, gibi "0x{0:X} {0:E} {0:N}"bir bileşik biçim dizesi belirterek aynı sayısal değeri onaltılık, bilimsel ve sayı biçiminde biçimlendirebilirsiniz:

string multiple = string.Format("0x{0:X} {0:E} {0:N}",
                                Int64.MaxValue);
Console.WriteLine(multiple);

// The example displays the following output:
//      0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
Dim multiple As String = String.Format("0x{0:X} {0:E} {0:N}",
                                       Int64.MaxValue)
Console.WriteLine(multiple)

'The example displays the following output
'     0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00

Her biçim öğesi listedeki herhangi bir nesneye başvurabilir. Örneğin, üç nesne varsa, gibi {1} {0} {2}bir bileşik biçim dizesi belirterek ikinci, birinci ve üçüncü nesneyi biçimlendirebilirsiniz. Biçim öğesi tarafından başvurulmuyor bir nesne yoksayılır. Bir FormatException parametre tanımlayıcısı nesne listesinin sınırlarının dışında bir öğe belirlerse, çalışma zamanında oluşturulur.

Hizalama bileşeni

İsteğe bağlı hizalama bileşeni, tercih edilen biçimlendirilmiş alan genişliğini gösteren imzalı bir tamsayıdır. Hizalama değeri biçimlendirilmiş dizenin uzunluğundan küçükse hizalama yoksayılır ve biçimlendirilmiş dizenin uzunluğu alan genişliği olarak kullanılır. Hizalama pozitifse alandaki biçimlendirilmiş veriler sağa, hizalama negatifse sola hizalanır. Eğer iç boşluk gerekliyse, boşluk kullanılır. Hizalama belirtilirse virgül gereklidir.

Aşağıdaki örnek, biri çalışanların adlarını, diğeri ise iki hafta boyunca çalıştıkları saatleri içeren iki diziyi tanımlar. Bileşik biçim dizesi, 20 karakterlik bir alandaki adları sola hizalar ve saatlerini 5 karakterlik bir alanda sağa hizalar. "N1" standart biçim dizesi, saatleri bir kesirli basamakla biçimlendirir.

string[] names = { "Adam", "Bridgette", "Carla", "Daniel",
                   "Ebenezer", "Francine", "George" };
decimal[] hours = { 40, 6.667m, 40.39m, 82,
                    40.333m, 80, 16.75m };

Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours");

for (int counter = 0; counter < names.Length; counter++)
    Console.WriteLine("{0,-20} {1,5:N1}", names[counter], hours[counter]);

// The example displays the following output:
//      Name                 Hours
//      
//      Adam                  40.0
//      Bridgette              6.7
//      Carla                 40.4
//      Daniel                82.0
//      Ebenezer              40.3
//      Francine              80.0
//      George                16.8
Dim names As String() = {"Adam", "Bridgette", "Carla", "Daniel",
                         "Ebenezer", "Francine", "George"}

Dim hours As Decimal() = {40, 6.667D, 40.39D, 82,
                          40.333D, 80, 16.75D}

Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours")

For counter = 0 To names.Length - 1
    Console.WriteLine("{0,-20} {1,5:N1}", names(counter), hours(counter))
Next

'The example displays the following output
'     Name                 Hours
'     
'     Adam                  40.0
'     Bridgette              6.7
'     Carla                 40.4
'     Daniel                82.0
'     Ebenezer              40.3
'     Francine              80.0
'     George                16.8

Dize bileşenini biçimlendirme

İsteğe bağlı formatString bileşeni, biçimlendirilmekte olan nesne türüne uygun bir biçim dizesidir. Şunları belirtebilirsiniz:

formatString belirtilmezse, sayısal, tarih ve saat veya numaralandırma türü için genel ("G") biçim tanımlayıcısı kullanılır. formatString belirtilirse iki nokta üst üste gereklidir.

Aşağıdaki tabloda, .NET sınıf kitaplığında önceden tanımlanmış biçim dizeleri kümesini destekleyen tür türleri veya kategorileri listelenmektedir ve desteklenen biçim dizelerini listeleyen makalelere bağlantılar sağlanmaktadır. Dize biçimlendirmesi, mevcut tüm türler için yeni biçim dizeleri tanımlamayı ve uygulama tanımlı bir tür tarafından desteklenen bir biçim dizeleri kümesi tanımlamayı mümkün kılan genişletilebilir bir mekanizmadır.

Daha fazla bilgi için ve ICustomFormatter arabirim makalelerine IFormattable bakın.

Tür veya tür kategorisi Bkz:
Tarih ve saat türleri (DateTime, DateTimeOffset) Standart Tarih ve Saat Biçim Dizeleri

Özel Tarih ve Saat Biçim Dizeleri
Numaralandırma türleri (türetilen System.Enumtüm türler) Sabit Listesi Biçim Dizeleri
Sayısal türler (BigInteger, Byte, Decimal, , Double, Int16, Int32, , Int64, , SByte, UInt64SingleUInt16UInt32) Standart Sayısal Biçim Dizeleri

Özel Sayısal Biçim Dizeleri
Guid Guid.ToString(String)
TimeSpan Standart TimeSpan Biçim Dizeleri

Özel TimeSpan Biçim Dizeleri

Kaçış ayraçları

Açma ve kapatma ayraçları bir biçim öğesinin başlangıcı ve bitişi olarak yorumlanır. Değişmez değer açma ayracı veya kapanış ayracı görüntülemek için bir kaçış dizisi kullanmanız gerekir. Bir açılış ayracı ({{ ) görüntülemek için sabit metinde iki açma ayracı ({) veya bir kapanış ayracı () görüntülemek için iki kapanış ayracı (}}}) belirtin.

Biçim öğesine sahip kaçış ayraçları .NET ve .NET Framework arasında farklı ayrıştırılır.

.NET

Küme ayraçları bir biçim öğesi çevresinden kaçılabilir. Örneğin, bir açılış ayracı, ondalık sayı olarak biçimlendirilmiş sayısal bir değer ve kapanış ayracı görüntülemeyi amaçlayan biçim öğesini {{{0:D}}}göz önünde bulundurun. Biçim öğesi aşağıdaki şekilde yorumlanır:

  1. İlk iki açılış ayracı ({{) kaçıştır ve bir açılış ayracı verir.
  2. Sonraki üç karakter ({0:) bir biçim öğesinin başlangıcı olarak yorumlanır.
  3. Sonraki karakter (D), Ondalık standart sayısal biçim tanımlayıcısı olarak yorumlanır.
  4. Sonraki küme ayracı (}), biçim öğesinin sonu olarak yorumlanır.
  5. Son iki kapanış ayracı kaçıştır ve bir kapanış ayracı verir.
  6. Görüntülenen son sonuç değişmez değer dizesidir {6324}.
int value = 6324;
string output = string.Format("{{{0:D}}}", value);

Console.WriteLine(output);
// The example displays the following output:
//       {6324}
Dim value As Integer = 6324
Dim output As String = String.Format("{{{0:D}}}", value)

Console.WriteLine(output)

'The example displays the following output
'      {6324}

.NET Framework

Biçim öğesindeki ayraçlar, karşılaşıldıkları sırayla sıralı olarak yorumlanır. İç içe küme ayraçlarının yorumlanması desteklenmez.

Kaçırılan ayraçların yorumlanma şekli beklenmeyen sonuçlara neden olabilir. Örneğin, bir açılış ayracı, ondalık sayı olarak biçimlendirilmiş sayısal bir değer ve kapanış ayracı görüntülemeyi amaçlayan biçim öğesini {{{0:D}}}göz önünde bulundurun. Ancak, biçim öğesi aşağıdaki şekilde yorumlanır:

  1. İlk iki açılış ayracı ({{) kaçıştır ve bir açılış ayracı verir.
  2. Sonraki üç karakter ({0:) bir biçim öğesinin başlangıcı olarak yorumlanır.
  3. Sonraki karakter (D) Ondalık standart sayısal biçim tanımlayıcısı olarak yorumlanır, ancak sonraki iki kaçış ayracı (}}) tek bir ayraç verir. Sonuçta elde edilen dize (D}) standart sayısal biçim tanımlayıcısı olmadığından, sonuçta elde edilen dize, değişmez değer dizesini görüntüleme anlamına gelen özel bir biçim dizesi D}olarak yorumlanır.
  4. Son küme ayracı (}), biçim öğesinin sonu olarak yorumlanır.
  5. Görüntülenen son sonuç değişmez değer dizesidir {D}. Biçimlendirilecek sayısal değer görüntülenmez.
int value = 6324;
string output = string.Format("{{{0:D}}}",
                              value);
Console.WriteLine(output);

// The example displays the following output:
//       {D}
Dim value As Integer = 6324
Dim output As String = String.Format("{{{0:D}}}",
                                     value)
Console.WriteLine(output)

'The example displays the following output:
'      {D}

Kaçış ayraçlarını ve biçim öğelerini yanlış yorumlamamak için kodunuzu yazmanın bir yolu, küme ayraçlarını biçimlendirmek ve öğeleri ayrı olarak biçimlendirmektir. Başka bir ifadeyle, ilk biçim işleminde değişmez değer açılış ayracı görüntülenir. Sonraki işlemde, biçim öğesinin sonucunu görüntüleyin ve son işlemde değişmez bir kapanış ayracı görüntüleyin. Aşağıdaki örnekte bu yaklaşım gösterilmektedir:

int value = 6324;
string output = string.Format("{0}{1:D}{2}",
                             "{", value, "}");
Console.WriteLine(output);

// The example displays the following output:
//       {6324}
Dim value As Integer = 6324
Dim output As String = String.Format("{0}{1:D}{2}",
                                     "{", value, "}")
Console.WriteLine(output)

'The example displays the following output:
'      {6324}

Sipariş işleniyor

Bileşik biçimlendirme yöntemine yapılan çağrı değeri olmayan bir IFormatProvider bağımsız değişken içeriyorsa, çalışma zamanı bir ICustomFormatter uygulama istemek için yöntemini çağırırIFormatProvider.GetFormat.null Yöntem bir ICustomFormatter uygulama döndürebiliyorsa bileşik biçimlendirme yöntemi çağrılırken önbelleğe alınır.

Parametre listesindeki bir biçim öğesine karşılık gelen her değer aşağıdaki gibi bir dizeye dönüştürülür:

  1. Biçimlendirilecek değer ise nullboş bir dize String.Empty döndürülür.

  2. Bir ICustomFormatter uygulama varsa, çalışma zamanı yöntemini Format çağırır. Çalışma zamanı biçim öğesinin formatString değerini (veya null yoksa) yöntemine geçirir. Çalışma zamanı, uygulamayı yöntemine de geçirir IFormatProvider . yöntemine ICustomFormatter.Format yapılan çağrı döndürürse nullyürütme sonraki adıma geçer. Aksi takdirde, çağrının ICustomFormatter.Format sonucu döndürülür.

  3. değer arabirimini uygularsa IFormattable arabirimin ToString(String, IFormatProvider) yöntemi çağrılır. Biçim öğesinde varsa, formatString değeri yöntemine geçirilir. Aksi takdirde geçirilir null . Bağımsız IFormatProvider değişken aşağıdaki gibi belirlenir:

  4. Türün temel sınıfının davranışını geçersiz kılan Object.ToString() veya devralan parametresiz ToString yöntemi çağrılır. Bu durumda, bileşen tarafından formatString biçim öğesinde belirtilen biçim dizesi (varsa) yoksayılır.

Üstteki adımlar gerçekleştirildikten sonra hizalama uygulanır.

Kod örnekleri

Aşağıdaki örnekte bileşik biçimlendirme kullanılarak oluşturulan bir dize ve nesnenin yöntemi kullanılarak oluşturulan başka bir dize gösterilmektedir ToString . İki biçimlendirme türü de eşdeğer sonuçlar üretir.

string formatString1 = string.Format("{0:dddd MMMM}", DateTime.Now);
string formatString2 = DateTime.Now.ToString("dddd MMMM");
Dim formatString1 As String = String.Format("{0:dddd MMMM}", DateTime.Now)
Dim formatString2 As String = DateTime.Now.ToString("dddd MMMM")

Geçerli günün Mayıs ayındaki bir Perşembe olduğunu varsayarsak, önceki örnekteki her iki dizenin de değeri ABD İngilizcesi kültüründedir Thursday May .

Console.WriteLine ile aynı işlevselliği String.Formatkullanıma sunar. İki yöntem String.Format arasındaki tek fark, sonucunu dize olarak döndürürken Console.WriteLine sonucu nesnesiyle ilişkili çıkış akışına yazmasıdır Console . Aşağıdaki örnek, Console.WriteLine değerini bir para birimi değerine myNumber biçimlendirmek için yöntemini kullanır:

int myNumber = 100;
Console.WriteLine("{0:C}", myNumber);

// The example displays the following output
// if en-US is the current culture:
//        $100.00
Dim myNumber As Integer = 100
Console.WriteLine("{0:C}", myNumber)

'The example displays the following output
'if en-US Is the current culture:
'       $100.00

Aşağıdaki örnek, bir nesneyi iki farklı şekilde biçimlendirme dahil olmak üzere birden çok nesneyi biçimlendirmeyi gösterir:

string myName = "Fred";
Console.WriteLine(string.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
                                myName, DateTime.Now));

// Depending on the current time, the example displays output like the following:
//        Name = Fred, hours = 11, minutes = 30
Dim myName As String = "Fred"
Console.WriteLine(String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
                                myName, DateTime.Now))
'Depending on the current time, the example displays output Like the following:
'       Name = Fred, hours = 11, minutes = 30

Aşağıdaki örnek biçimlendirmede hizalama kullanımını gösterir. Biçimlendirilmiş bağımsız değişkenler, sonuçta elde edilen hizalamayı vurgulamak için dikey çubuk karakterleri (|) arasına yerleştirilir.

string firstName = "Fred";
string lastName = "Opals";
int myNumber = 100;

string formatFirstName = string.Format("First Name = |{0,10}|", firstName);
string formatLastName = string.Format("Last Name =  |{0,10}|", lastName);
string formatPrice = string.Format("Price =      |{0,10:C}|", myNumber);
Console.WriteLine(formatFirstName);
Console.WriteLine(formatLastName);
Console.WriteLine(formatPrice);
Console.WriteLine();

formatFirstName = string.Format("First Name = |{0,-10}|", firstName);
formatLastName = string.Format("Last Name =  |{0,-10}|", lastName);
formatPrice = string.Format("Price =      |{0,-10:C}|", myNumber);
Console.WriteLine(formatFirstName);
Console.WriteLine(formatLastName);
Console.WriteLine(formatPrice);

// The example displays the following output on a system whose current
// culture is en-US:
//     First Name = |      Fred|
//     Last Name =  |     Opals|
//     Price =      |   $100.00|
//
//     First Name = |Fred      |
//     Last Name =  |Opals     |
//     Price =      |$100.00   |
Dim firstName As String = "Fred"
Dim lastName As String = "Opals"
Dim myNumber As Integer = 100

Dim formatFirstName As String = String.Format("First Name = |{0,10}|", firstName)
Dim formatLastName As String = String.Format("Last Name =  |{0,10}|", lastName)
Dim formatPrice As String = String.Format("Price =      |{0,10:C}|", myNumber)
Console.WriteLine(formatFirstName)
Console.WriteLine(formatLastName)
Console.WriteLine(formatPrice)
Console.WriteLine()

formatFirstName = String.Format("First Name = |{0,-10}|", firstName)
formatLastName = String.Format("Last Name =  |{0,-10}|", lastName)
formatPrice = String.Format("Price =      |{0,-10:C}|", myNumber)
Console.WriteLine(formatFirstName)
Console.WriteLine(formatLastName)
Console.WriteLine(formatPrice)

'The example displays the following output on a system whose current
'culture Is en-US:
'    First Name = |      Fred|
'    Last Name =  |     Opals|
'    Price =      |   $100.00|
'
'    First Name = |Fred      |
'    Last Name =  |Opals     |
'    Price =      |$100.00   |

Ayrıca bkz.