Aracılığıyla paylaş


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. Bir interpolasyon dizisi interpolasyonlu ifadeler içerir. Her bir ara ifade, ifadenin değeriyle hesaplanır 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çim dizesi ve nesne listesi, bileşik biçimlendirme özelliğini destekleyen yöntemlerin bağımsız değişkenleri olarak kullanılır. Bileşik biçim dizesi, sabit metin parçaları ve bir veya daha fazla biçim öğesinin karışımından oluşur. Sabit metin, seçtiğiniz herhangi bir dizedir ve her biçim öğesi listedeki bir nesneye veya kutulanmış 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 Name = ve , hours = şeklindedir. Biçim öğeleri şunlardır: {0}, 0 dizini nesnesine karşılık gelir, ve name, 1 dizini nesnesine karşılık gelir.

Öğ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[,width][:formatString]}

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

Dizin bileşeni

Parametre tanımlayıcısı olarak da adlandırılan zorunlu index bileşen, 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 primes = string.Format("Four prime numbers: {0}, {1}, {2}, {3}",
                              2, 3, 5, 7);
Console.WriteLine(primes);

// The example displays the following output:
//      Four prime numbers: 2, 3, 5, 7
Dim primes As String = String.Format("Four prime numbers: {0}, {1}, {2}, {3}",
                                      2, 3, 5, 7)
Console.WriteLine(primes)

'The example displays the following output
'     Four prime numbers 2, 3, 5, 7

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şvurulmayan bir nesne yoksayılır. Çalışma zamanında, bir parametre tanımlayıcısı nesne listesinin sınırlarının dışında bir öğeyi belirlerse bir FormatException oluşturulur.

Genişlik bileşeni

İsteğe bağlı width bileşen, tercih edilen biçimlendirilmiş alan genişliğini gösteren imzalı bir tamsayıdır. width değerinin biçimlendirilmiş dizenin uzunluğundan küçük olması durumunda, width yoksayılır ve biçimlendirilmiş dizenin uzunluğu alan genişliği olarak kullanılır. Alandaki biçimlendirilmiş veriler pozitifse width sağa, negatifse width sola hizalanır. Dolgu gerekiyorsa boşluk kullanılır. width belirtilmişse 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 ondalık 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şen, biçimlendirilmekte olan nesne türüne uygun bir biçim dizesidir. Şunları belirtebilirsiniz:

  • Karşılık gelen nesne sayısal bir değerse standart veya özel bir sayısal biçim dizesi.
  • Karşılık gelen nesne bir DateTime nesnesiyse, standart veya özel tarih ve saat biçim dizesi.
  • Karşılık gelen nesne bir numaralandırma değeriyse, numaralandırma biçimi dizisi.

Belirtilmezse formatString , sayısal, tarih ve saat veya numaralandırma türü için genel ("G") biçim tanımlayıcısı kullanılır. formatString belirtilmişse 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 IFormattable ve ICustomFormatter arabirim makalelerine 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
Sayımsal türler (System.Enum'den türetilen tüm türler) Numaralandırma Biçim Dizeleri
Sayısal türler (BigInteger, Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64) 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ı, biçim öğesini başlatma ve sonlandırma olarak yorumlanır. Sabit bir açılış veya kapanış süslü parantez 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.

.NET ve .NET Framework arasında biçim öğesi içeren kaçış ayraçlarının ayrıştırılma şekli farklıdır.

.NET

Bir biçim öğesinin çevresindeki küme ayraçlarından kaçış yapı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ılmış ve bir açılış ayracı oluşturur.
  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öşeli parantez (}), biçim öğesinin bitişi olarak yorumlanır.
  5. Son iki kapanış ayracı kaçış karakteri olarak kullanılır ve sonunda bir kapanış ayracı oluşur.
  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 Çerçevesi

Biçim öğesindeki ayraçlar, karşılaşıldıkları sıraya göre sırasıyla yorumlanır. İç içe küme ayraçlarının yorumlanması desteklenmez.

Kaçış ayraçlarının yorumlanması beklenmeyen sonuçlara yol açabilir. Ö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ılmış ve bir açılış ayracı oluşturur.
  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 bir sayısal biçim belirleyicisi olmadığı için, bu dize, değişmez bir metin olan D}'i görüntüleyecek şekilde özel bir biçim dizesi 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. Yani, ilk biçimlendirme işleminde bir açılış süslü parantezi görüntülenir. Sonraki işlemde, biçim öğesinin sonucunu görüntüleyin ve son işlemde sabit bir kapanış ayracı gösterin. 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 IFormatProvider olmayan bir null bağımsız değişken içeriyorsa, çalışma zamanı bir IFormatProvider.GetFormat uygulama istemek için ICustomFormatter yöntemini çağırır. 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. Eğer bir ICustomFormatter uygulama mevcutsa, çalışma zamanı ortamı Format yöntemini çağırır. Çalışma zamanı, biçim öğesinin formatString değerini (eğer mevcut değilse null değerini) yönteme geçirir. Çalışma zamanı, IFormatProvider implementasyonu yöntemine de geçirir. ICustomFormatter.Format yöntemine yapılan çağrı null döndürürse, yürütme sonraki adıma geçer. Aksi takdirde, çağrının ICustomFormatter.Format sonucu döndürülür.

  3. Eğer bu değer IFormattable arabirimini uygularsa, arabirimin ToString(String, IFormatProvider) yöntemi çağrılır. Biçim öğesinde bir varsa, formatString değeri yönteme geçirilir. Aksi takdirde null geçilir. IFormatProvider argümanı aşağıdaki gibi belirlenir:

  4. Parametresiz ToString yöntemi çağrılır; bu yöntem ya Object.ToString()'yi geçersiz kılar ya da temel sınıfının davranışını devralır. Bu durumda, bileşen tarafından formatString biçim öğesinde belirtilen biçim dizesi (varsa) yoksayılır.

Hizalama, önceki adımlar gerçekleştirildikten sonra uygulanır.

Kod örnekleri

Aşağıdaki örnekte, bileşik biçimlendirme kullanılarak oluşturulan bir dize ve bir nesnenin ToString yöntemi kullanılarak oluşturulan başka bir dize gösterilmektedir. Her iki 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 arasındaki tek fark, String.Format'nın sonucunu bir dize olarak döndürmesi, Console.WriteLine'nin ise sonucu Console nesnesiyle ilişkili çıkış akışına yazmasıdır. 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($"{myNumber:C}");

// 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 örnekte, biçimlendirmede genişlik kullanımı gösterilmektedir. 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.