Bileşik biçimlendirme

.NET bileşik biçimlendirme özelliği, giriş olarak nesnelerin listesini ve bileşik biçim dizesini alır. Bir bileşik biçimlendirme dizesi, sabit metinle karışık bir şekilde listedeki nesnelere karşılık gelen, biçim öğeleri adı verilen dizinli yer tutuculardan oluşur. 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, kullanmakta olduğu dil ve dil sürümü bunları destekliyorsa ibiçimlendirilmiş dizeler kullanabilirsiniz. İlişkili dize, irdelenmiş ifadeler içeren bir dizedir. İlişkili her ifade, ifadenin değeriyle çözümlenir ve dize atandığı zaman sonuç dizesine dahil edilir. Daha fazla bilgi için bkz. Dize ilişkilendirme (C# Başvurusu) ve İlişkili dizeler (Visual Basic Reference).

Bileşik biçimlendirme özelliği aşağıdaki gibi yöntemler tarafından desteklenir:

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. Bileşik biçimlendirme özelliği, her biçim öğesinin yerine listede karşılık gelen nesnenin dize temsili yerleştirilmiş bir şekilde yeni bir sonuç dizesi döndürür.

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

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

Sabit metin " Name = " ve " " " , hours = şeklindedir. Biçim öğeleri, dizini 0 olan ve nesnesine karşılık gelen dizini 1 olan {0} name " " {1:hh} "'dır. DateTime.Now

Biçim Öğesi Sözdizimi

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

{index[ , hizalama][ : formatString]}

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

Dizin Bileşeni

Parametre belirteci olarak da adlandırılan zorunlu dizin bileşeni, nesne listesinde karşılık gelen öğeyi tanımlayan 0'dan başlayarak bir sayıdır. Yani, parametre tanımlayıcısı 0 olan biçim öğesi listedeki ilk nesneyi biçimlendirir, parametre tanımlayıcısı 1 olan biçim öğesi listedeki ikinci nesneyi biçimlendirir ve bu şekilde devam eder. Aşağıdaki örnek, ondan küçük asal sayıları temsil etmek için sıfırdan üçe kadar numaralı dört parametre belirteci içerir:

string primes;
primes = String.Format("Prime numbers less than 10: {0}, {1}, {2}, {3}",
                       2, 3, 5, 7 );
Console.WriteLine(primes);
// The example displays the following output:
//      Prime numbers less than 10: 2, 3, 5, 7
Dim primes As String
primes = String.Format("Prime numbers less than 10: {0}, {1}, {2}, {3}",
                       2, 3, 5, 7)
Console.WriteLine(primes)
' The example displays the following output:
'      Prime numbers less than 10: 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 de olduğu gibi , "0x " gibi bir bileşik biçim dizesi belirterek aynı sayısal değeri onaltılık, bilimsel ve sayı biçiminde {0:X} {0:E} {0:N} 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, aşağıdakine benzer bir bileşik biçim dizesi belirterek ikinci, birinci ve üçüncü nesneyi biçimlendirebilirsiniz: " {1} {0} {2} ". Bir biçimlendirme nesnesi tarafından başvurulmayan nesneler yok sayılır. Bir parametre belirteci nesne listesinin sınırlarının dışında bir öğe belirtirse, çalışma FormatException zamanında bir oluşturur.

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 biçimlendirilmiş veriler sağa hizalanır, hizalama negatifse sola hizalanır. Eğer iç boşluk gerekliyse, boşluk kullanılır. Hizalama belirtilmişse virgül gereklidir.

Aşağıdaki örnek, biri çalışan adlarını, diğeri ise iki haftalık bir süre boyunca çalıştıkları saatleri içeren iki dizi tanımlar. Bileşik biçim dizesi, 20 karakterlik bir alanda adları sola hizalar ve saatlerini 5 karakterlik bir alanda sağa hizalar. Saatleri tek bir kesirli basamakla biçimlendirmek için "N1" standart biçim dizesinin de kullanılır.

using System;

public class Example
{
   public static void Main()
   {
      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 ctr = 0; ctr < names.Length; ctr++)
         Console.WriteLine("{0,-20} {1,5:N1}", names[ctr], hours[ctr]);
   }
}
// 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
Module Example
    Public Sub Main()
        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}", "Name", "Hours")
        Console.WriteLine()
        For ctr As Integer = 0 To names.Length - 1
            Console.WriteLine("{0,-20} {1,5:N1}", names(ctr), hours(ctr))
        Next
    End Sub
End Module
' 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

Biçim Dizesi Bileşeni

İsteğe bağlı formatString bileşeni, biçimlendiren nesnenin türüne uygun bir biçim dizesidir. Karşılık gelen nesne sayısal bir değerse standart veya özel sayısal biçim dizesi, karşılık gelen nesne bir nesne ise standart veya özel tarih ve saat biçimi dizesi veya karşılık gelen nesne bir numaralama değeri ise bir numaralama biçimi dizesi DateTime belirtin. formatString belirtilmezse sayısal, tarih ve saat veya numaralama türü için genel ("G") biçim belirtici kullanılır. formatString belirtilmişse iki nokta üst üste gereklidir.

Aşağıdaki tablo, .NET sınıf kitaplığında önceden tanımlanmış bir biçim dizeleri kümesi destekleyen türleri veya tür kategorilerini listeler ve desteklenen biçim dizelerini listeleyen konulara bağlantılar sağlar. Dize biçimlendirmenin, tüm varolan türler için yeni biçimlendirme dizeleri tanımlanabilmesini mümkün kılmanın yanı sıra uygulamada tanımlanmış bir tür tarafından desteklenen bir biçimlendirme dizesi kümesinin tanımlanabilmesine olanak veren genişletilebilir bir mekanizma olduğuna dikkat edin. Daha fazla bilgi için ve arabirimi IFormattable ICustomFormatter konularına 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
Numaralama türleri (türetilen tüm System.Enum türler) Enumeration 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

Çıkış Yapan Ayraçlar

Açma ve kapatma ayraçları bir biçim öğesinin başlangıcı ve bitişi olarak yorumlanır. Sonuç olarak, sabit bir açılış veya kapanış ayracını 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çılış ayracı ("{{"), veya bir kapanış ayracı ("}") görüntülemek için sabit metinde iki kapanış ayracı ("}}") belirtin. Bir biçim öğesindeki ayraçlar, karşılaşıldıkları sırada sıralı olarak yorumlanır. İç içe ayraçları yorumlama desteklenmez.

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

  1. İlk iki açılış ayracı ("{{") kaçırılır ve bir açılış ayracı olur.

  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çırılan ayıraç ("}}") tek bir ayıraç olur. Sonuç dize ("D}") standart bir sayısal biçim tanımlayıcısı olmadığı için, sonuç dize özel bir biçimlendirme dizesi olarak yorumlanır ve bu nedenle "D}" sabit dizesini görüntüler.

  4. Son ayıraç ("}") biçim öğesinin bitişi olarak yorumlanır.

  5. Sonuç olarak "{D}" sabit dizesi görüntülenir. Biçimlendirilmek istenen sayısal değer görüntülenmez.

Kodunuzun kaçırılan ayraçları ve format öğelerini yanlış yorumlamasından kaçınmanın bir yolu, ayraçları ve biçim öğesini ayrı olarak biçimlendirmektir. Yani, ilk biçimlendirme işleminde bir sabit açılış ayracı görüntülemek, sonraki işlemde biçim öğesinin sonucunu görüntülemek ve son işlemde de bir sabit kapanış ayracı görüntülemektir. Aşağıdaki örnek bu yaklaşımı gösterir.

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}

İşlem Sırası

Bileşik biçimlendirme yöntemine yapılan çağrı, değeri olmayan bir bağımsız değişken IFormatProvider içerirse, çalışma zamanı bir null uygulama IFormatProvider.GetFormat isteğinde bulunan yöntemini ICustomFormatter çağırtır. yöntemi bir uygulama getirene kadar bileşik biçimlendirme yönteminin ICustomFormatter çağrısı süresince önbelleğe alınmış olur.

Parametre listesinde 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çimlendirilen değer ise null boş bir dize String.Empty döndürülür.

  2. Bir uygulama ICustomFormatter kullanılabilirse, çalışma zamanı yöntemini Format çağıran. Yöntemi, biçim öğesinin formatString değerini (varsa veya mevcutsa) null uygulamayla birlikte ile IFormatProvider birlikte iletir. yöntemine yapılan çağrı ICustomFormatter.Format null döndürülürse, yürütme sonraki adıma devam eder; aksi takdirde ICustomFormatter.Format çağrının sonucu döndürülür.

  3. Değer arabirimini IFormattable uygulayıyorsa arabirimin ToString(String, IFormatProvider) yöntemi çağrılır. yönteme formatString değeri, biçim öğesinde varsa veya bu değer null mevcutsa geçirildi. bağımsız IFormatProvider değişkeni aşağıdaki gibi belirlenir:

  4. Türün parametresiz ToString yöntemi, Object.ToString() temel sınıfının davranışını geçersiz kılan veya devralan, çağrılır. Bu durumda, biçim öğesinde FormatString bileşeni tarafından belirtilen biçim dizesi varsa, yok sayı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 bir nesnenin yöntemi kullanılarak oluşturulan 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 değerindeki bir Perşembe olduğu varsayılırsa, yukarıdaki örnekteki her iki dizenin de değeri Thursday May ABD İngilizcesi kültür ' dadır.

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

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

Aşağıdaki örnek birden çok nesneyi biçimlendirmeyi ve bir nesneyi iki farklı şekilde 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çimlendirilen bağımsız değişkenler, ortaya çıkan hizalamayı vurgulamak için dikey çubuk karakterleri (|) arasına yerleştirilir.

string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = |{0,10}|", myFName);
string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
string FormatPrice = String.Format("Price = |{0,10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);
Console.WriteLine();

FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
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 myFName As String = "Fred"
Dim myLName As String = "Opals"

Dim myInt As Integer = 100
Dim FormatFName As String = String.Format("First Name = |{0,10}|", myFName)
Dim FormatLName As String = String.Format("Last Name = |{0,10}|", myLName)
Dim FormatPrice As String = String.Format("Price = |{0,10:C}|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
Console.WriteLine(FormatPrice)
Console.WriteLine()

FormatFName = String.Format("First Name = |{0,-10}|", myFName)
FormatLName = String.Format("Last Name = |{0,-10}|", myLName)
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
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.