Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Biçimlendirme, bir sınıfın veya yapının örneğini ya da numaralandırma değerini dize gösterimine dönüştürme işlemidir. Amaç, sonuçta elde edilen dizeyi kullanıcılara göstermek veya özgün veri türünü geri yüklemek için daha sonra seriden çıkarmaktır. Bu makalede .NET'in sağladığı biçimlendirme mekanizmaları tanıtılmaktadır.
Not
Ayrıştırma, biçimlendirmenin tersidir. Ayrıştırma işlemi, dize gösteriminden bir veri türünün örneğini oluşturur. Daha fazla bilgi için bkz. Dizeleri Ayrıştırma. Serileştirme ve seri durumdan çıkarma hakkında bilgi için bkz .NET'te Serileştirme.
Biçimlendirme için temel mekanizma, bu makalenin Object.ToString devamında yer alan ToString Yöntemini Kullanarak Varsayılan Biçimlendirme bölümünde açıklanan yöntemin varsayılan uygulamasıdır. Ancak.NET, varsayılan biçimlendirme desteğini değiştirmek ve genişletmek için çeşitli yollar sağlar. Bunlar aşağıdakileri içerir:
Bir nesnenin değerine özel bir dize gösterimi tanımlamak için Object.ToString yöntemini geçersiz kılma. Daha fazla bilgi için bu makalenin devamında yer alan ToString Yöntemini Geçersiz Kılma bölümüne bakın.
Nesne değerinin dize gösteriminin birden çok form almasını sağlayan biçim tanımlayıcıları tanımlama. Örneğin, aşağıdaki deyimdeki "X" biçim tanımlayıcısı bir tamsayıyı onaltılık değerin dize gösterimine dönüştürür.
int integerValue = 60312; Console.WriteLine(integerValue.ToString("X")); // Displays EB98.Dim integerValue As Integer = 60312 Console.WriteLine(integerValue.ToString("X")) ' Displays EB98.Biçim tanımlayıcıları hakkında daha fazla bilgi için ToString Yöntemi ve Biçim Dizeleri bölümüne bakın.
Belirli bir kültürün biçimlendirme kurallarını uygulamak için biçim sağlayıcılarını kullanma. Örneğin, aşağıdaki ifade, ABD İngilizcesi kültürünün biçimlendirme kurallarını kullanarak bir para birimi değeri görüntüler.
double cost = 1632.54; Console.WriteLine(cost.ToString("C", new System.Globalization.CultureInfo("en-US"))); // The example displays the following output: // $1,632.54Dim cost As Double = 1632.54 Console.WriteLine(cost.ToString("C", New System.Globalization.CultureInfo("en-US"))) ' The example displays the following output: ' $1,632.54Biçim sağlayıcılarıyla biçimlendirme hakkında daha fazla bilgi için Biçim Sağlayıcıları bölümüne bakın.
Hem IFormattable arabirimini uygulayarak dize dönüştürmeyi desteklemek hem de Convert sınıfı ile bileşik biçimlendirmeyi desteklemek. Daha fazla bilgi için IFormattable Arabirimi bölümüne bakın.
Bir değerin dize gösterimini daha büyük bir dizeye eklemek için bileşik biçimlendirme kullanma. Daha fazla bilgi için Bileşik Biçimlendirme bölümüne bakın.
Dize ilişkilendirmesini kullanarak, bir değerin dize gösterimini daha büyük bir dizeye eklemek için daha okunabilir bir söz dizimi. Daha fazla bilgi için bkz . Dize ilişkilendirme.
ICustomFormatter ve IFormatProvider'i uygulayarak eksiksiz bir özel biçimlendirme çözümü sağlamak. Daha fazla bilgi için ICustomFormatter ile Özel Biçimlendirme bölümüne bakın.
Aşağıdaki bölümlerde, bir nesneyi dize gösterimine dönüştürmek için bu yöntemler incelendi.
ToString yöntemini kullanarak varsayılan biçimlendirme
öğesinden System.Object türetilen her tür, varsayılan olarak türün adını döndüren parametresiz ToString bir yöntemi otomatik olarak devralır. Aşağıdaki örnekte varsayılan ToString yöntem gösterilmektedir. Uygulaması olmayan adlı Automobile bir sınıf tanımlar. Sınıf örneği oluşturulduğunda ve ToString yöntemi çağrıldığında, sınıfın tür adını görüntüler.
ToString yöntemi örnekte açıkça çağrılmaz.
Console.WriteLine(Object) yöntemi, bağımsız değişken olarak geçirilen nesnenin ToString yöntemini örtük olarak çağırır.
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
Uyarı
Windows 8.1'den başlayarak Windows Çalışma Zamanı, varsayılan biçimlendirme desteği sağlayan IStringable.ToStringIStringablesahip bir arabirim içerir. Ancak, yönetilen türlerin IStringable arabirimini uygulamamalarını tavsiye ederiz. Daha fazla bilgi için Windows Çalışma Zamanı ve IStringable Arayüzü'ne bakın.
Arabirimler dışındaki tüm türler Object tarafından türetildiğinden, bu işlevsellik özel sınıflarınıza veya yapılarınıza otomatik olarak sağlanır. Ancak, varsayılan ToString yöntem tarafından sunulan işlevsellik sınırlıdır: Türü tanımlasa da, türün bir örneği hakkında herhangi bir bilgi sağlayamaz. Bir nesne hakkında bilgi sağlayan bir nesnenin dize gösterimini sağlamak için yöntemini geçersiz kılmanız ToString gerekir.
Not
Yapılar, ValueType'den devralır, bu da Object'den türetilmiştir. ValueType Object.ToString'i geçersiz kılsa da, uygulaması aynıdır.
ToString yöntemini geçersiz kılma
Bir türün adını görüntülemek genellikle sınırlı kullanım içindir ve türünüzün tüketicilerinin bir örneği diğerinden ayırt etmelerine izin vermez. Ancak, bir nesnenin ToString değerinin daha kullanışlı bir gösterimini sağlamak için yöntemini geçersiz kılabilirsiniz. Aşağıdaki örnek, bir Temperature nesnesini tanımlar ve sıcaklığı Celsius cinsinden göstermek için ToString yöntemini geçersiz kılar.
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.
.NET'te, her bir ilkel değer türünün yöntemi, nesnenin adını değil, değerini göstermek için geçersiz kılınmıştır. Aşağıdaki tabloda her temel tür için geçersiz kılma durumu gösterilmektedir. Geçersiz kılınan yöntemlerin çoğu, başka bir aşırı yüklenmiş ToString yöntemini çağırır ve türü için genel biçimi tanımlayan "G" biçim tanımlayıcısını ve geçerli kültürü temsil eden bir IFormatProvider nesneyi geçirir.
| Tür | ToString yöntemi geçersiz kılma |
|---|---|
| Boolean | Boolean.TrueString veya Boolean.FalseString döndürür. |
| Byte | Geçerli kültür için Byte.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Byte çağrılır. |
| Char | Karakteri string olarak döndürür. |
| DateTime |
DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo), geçerli kültür için tarih ve saat değerini biçimlendirmek amacıyla çağrılır. |
| Decimal | Geçerli kültür için Decimal.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Decimal çağrılır. |
| Double | Geçerli kültür için Double.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Double çağrılır. |
| Int16 | Geçerli kültür için Int16.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Int16 çağrılır. |
| Int32 | Geçerli kültür için Int32.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Int32 çağrılır. |
| Int64 | Geçerli kültür için Int64.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Int64 çağrılır. |
| SByte | Geçerli kültür için SByte.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla SByte çağrılır. |
| Single | Geçerli kültür için Single.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla Single çağrılır. |
| UInt16 | Geçerli kültür için UInt16.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla UInt16 çağrılır. |
| UInt32 | Geçerli kültür için UInt32.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla UInt32 çağrılır. |
| UInt64 | Geçerli kültür için UInt64.ToString("G", NumberFormatInfo.CurrentInfo) değerini biçimlendirmek amacıyla UInt64 çağrılır. |
ToString yöntemi ve biçim dizeleri
Nesnenin tek bir dize gösterimi olduğunda, varsayılan ToString yöntemi kullanmak veya ToString yöntemini geçersiz kılmak uygundur. Ancak, bir nesnenin değeri genellikle birden çok gösterime sahiptir. Örneğin, bir sıcaklık Fahrenheit, santigrat derece veya kelvin cinsinden ifade edilebilir. Benzer şekilde, 10 tamsayı değeri 10, 10,0, 1,0e01 veya 10,00 TL gibi çeşitli yollarla temsil edilebilir.
.NET, tek bir değerin birden çok dize gösterimine sahip olmasını sağlamak için biçim dizelerini kullanır. Biçim dizesi, yöntemin çıkışını nasıl ToString biçimlendirmesi gerektiğini tanımlayan tek karakterler veya karakter grupları olan, önceden tanımlanmış bir veya daha fazla biçim tanımlayıcısı içeren bir dizedir. Biçim dizesi daha sonra nesnenin ToString yöntemine parametre olarak geçirilir ve nesnenin değerinin dize gösteriminin nasıl görüneceğini belirler.
.NET'teki tüm sayısal türler, tarih ve saat türleri ve numaralandırma türleri önceden tanımlanmış biçim tanımlayıcıları kümesini destekler. Uygulama tanımlı veri türlerinizin birden çok dize gösterimini tanımlamak için biçim dizelerini de kullanabilirsiniz.
Standart biçim dizeleri
Standart biçim dizesi, uygulandığı nesnenin dize gösterimini tanımlayan alfabetik bir karakter olan tek bir biçim tanımlayıcısı ve sonuç dizesinde görüntülenen basamak sayısını etkileyen isteğe bağlı bir duyarlık tanımlayıcısı içerir. Kesinlik belirtici atlanırsa veya desteklenmiyorsa, standart biçim belirticisi standart biçim dizesine eşdeğerdir.
.NET, tüm sayısal türler, tüm tarih ve saat türleri ve tüm numaralandırma türleri için bir dizi standart biçim tanımlayıcısı tanımlar. Örneğin, bu kategorilerin her biri, bu tür bir değerin genel dize gösterimini tanımlayan "G" standart biçim tanımlayıcısını destekler.
Numaralandırma türleri için standart biçim dizeleri, bir değerin dize gösterimini doğrudan denetler. Bir numaralandırma değerinin ToString yöntemine geçirilen biçim dizeleri, değerin dize adı ("G" ve "F" biçim tanımlayıcıları), temel integral değeri ("D" biçim belirticisi) veya onaltılık değeri ("X" biçim tanımlayıcısı) kullanılarak görüntülenip görüntülenmeyeceğini belirler. Aşağıdaki örnekte, bir DayOfWeek numaralandırma değerini biçimlendirmek için standart biçim dizelerinin kullanımı gösterilmektedir.
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
Numaralandırma biçimi dizeleri hakkında bilgi için bkz . Numaralandırma Biçimi Dizeleri.
Sayısal türler için standart biçim dizeleri genellikle kesin görünümü bir veya daha fazla özellik değeri tarafından denetlenen bir sonuç dizesi tanımlar. Örneğin, "C" biçim belirticisi bir sayıyı para birimi değeri olarak biçimlendirir. Yöntemini tek parametre olarak "C" biçim tanımlayıcısı ile çağırdığınızda ToString , sayısal değerin dize gösterimini tanımlamak için geçerli kültürün NumberFormatInfo nesnesinden aşağıdaki özellik değerleri kullanılır:
CurrencySymbol Geçerli kültürün para birimi simgesini belirten özelliği.
CurrencyNegativePattern veya CurrencyPositivePattern özelliği, aşağıdakileri belirleyen bir tamsayı döndürür:
Para birimi simgesinin yerleşimi.
Negatif değerlerin baştaki negatif işaretle mi, sondaki negatif işaretle mi yoksa parantezle mi gösterilip belirtilmediği.
Sayısal değer ile para birimi simgesi arasında boşluk görünüp görünmediği.
CurrencyDecimalDigits Sonuç dizesindeki kesirli basamak sayısını tanımlayan özelliği.
Sonuç CurrencyDecimalSeparator dizesindeki ondalık ayırıcı simgesini tanımlayan özelliği.
Grup CurrencyGroupSeparator ayırıcı simgesini tanımlayan özelliği.
Ondalık CurrencyGroupSizes noktasının solundaki her gruptaki basamak sayısını tanımlayan özellik.
Negatif NegativeSign değerleri belirtmek için parantezler kullanılmadıysa sonuç dizesinde kullanılan negatif işareti belirleyen özelliği.
Buna ek olarak, sayısal biçim dizeleri bir duyarlık tanımlayıcısı içerebilir. Bu tanımlayıcının anlamı, kullanıldığı biçim dizesine bağlıdır, ancak genellikle toplam basamak sayısını veya sonuç dizesinde görünmesi gereken kesirli basamak sayısını gösterir. Örneğin, aşağıdaki örnek dört onaltılık basamak içeren bir dize değeri oluşturmak için "X4" standart sayısal dizesini ve bir duyarlık tanımlayıcısını kullanır.
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
Standart sayısal biçimlendirme dizeleri hakkında daha fazla bilgi için bkz . Standart Sayısal Biçim Dizeleri.
Tarih ve saat değerleri için standart biçim dizeleri, belirli DateTimeFormatInfo bir özellik tarafından depolanan özel biçim dizelerinin diğer adlarıdır. Örneğin, "D" biçim tanımlayıcısı ile bir tarih ve saat değerinin yöntemini çağırmak ToString , geçerli kültürün DateTimeFormatInfo.LongDatePattern özelliğinde depolanan özel biçim dizesini kullanarak tarih ve saati görüntüler. (Özel biçim dizeleri hakkında daha fazla bilgi için sonraki bölüme bakın.) Aşağıdaki örnekte bu ilişki gösterilmektedir.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
DateTime date1 = new DateTime(2009, 6, 30);
Console.WriteLine($"D Format Specifier: {date1:D}");
string longPattern = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern;
Console.WriteLine($"'{longPattern}' custom format string: {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
Standart tarih ve saat biçim dizeleri hakkında daha fazla bilgi için bkz . Standart Tarih ve Saat Biçim Dizeleri.
Standart biçim dizelerini, nesnenin yöntemi tarafından oluşturulan uygulama tanımlı bir nesnenin dize gösterimini ToString(String) tanımlamak için de kullanabilirsiniz. Nesnenizin desteklediği belirli bir standart biçim tanımlayıcılarını tanımlayabilir ve bunların büyük/küçük harfe duyarlı mı yoksa duyarsız mı olduğunu belirleyebilirsiniz. Sizin ToString(String) yönteminizi uygulamanız aşağıdakileri desteklemelidir:
Nesnenin özel veya ortak biçimini temsil eden bir "G" biçim tanımlayıcısı. Nesnenizin
ToStringyönteminin parametresiz aşırı yüklemesi,ToString(String)aşırı yüklemesini çağırmalı ve ona "G" standart biçim dizesini iletmelidir.Null başvuruya eşit bir biçim belirticisi desteği (Visual Basic'te
Nothing). Null başvuruya eşit bir biçim tanımlayıcısı, "G" biçim tanımlayıcısına eşdeğer olarak kabul edilmelidir.
Örneğin, bir Temperature sınıf dahili olarak sıcaklığı santigrat derece olarak depolayabilir ve nesnenin Temperature değerini santigrat derece, Fahrenheit ve kelvins cinsinden temsil etmek için biçim tanımlayıcıları kullanabilir. Aşağıdaki örnek, bir gösterim sağlar.
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.
Özel biçim dizeleri
.NET, standart biçim dizelerine ek olarak hem sayısal değerler hem de tarih ve saat değerleri için özel biçim dizeleri tanımlar. Özel biçim dizesi, bir değerin dize gösterimini tanımlayan bir veya daha fazla özel biçim belirticiden oluşur. Örneğin, "yyyy/mm/dd hh:mm:ss.ffff t zzz" özel tarih ve saat biçim dizesi, bir tarihi en-US kültürü için "2008/11/15 07:45:00.0000 P -08:00" biçiminde dize gösterimine dönüştürür. Benzer şekilde, "0000" özel biçim dizesi 12 tamsayı değerini "0012" olarak dönüştürür. Özel biçim dizelerinin tam listesi için bkz . Özel Tarih ve Saat Biçim Dizeleri ve Özel Sayısal Biçim Dizeleri.
Biçim dizesi tek bir özel biçim tanımlayıcısından oluşuyorsa, standart biçim tanımlayıcısıyla karışıklığı önlemek için biçim belirticisinin önünde yüzde (%) simgesi bulunmalıdır. Aşağıdaki örnek, belirli bir tarihin ayının bir veya iki basamaklı numarasını görüntülemek için "M" özel biçim tanımlayıcısını kullanır.
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
Tarih ve saat değerleri için birçok standart biçim dizesi, nesnenin DateTimeFormatInfo özellikleri tarafından tanımlanan özel biçim dizelerinin diğer adlarıdır. Özel biçim dizeleri, sayısal değerler veya tarih ve saat değerleri için uygulama tanımlı biçimlendirme sağlama konusunda da önemli esneklik sunar. Birden çok özel biçim tanımlayıcısını tek bir özel biçim dizesinde birleştirerek hem sayısal değerler hem de tarih ve saat değerleri için kendi özel sonuç dizelerinizi tanımlayabilirsiniz. Aşağıdaki örnek, ayın adını, gününü ve yılını izleyen haftanın gününü parantez içinde görüntüleyen özel bir biçim dizesi tanımlar.
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)
Aşağıdaki örnek, bir Int64 değeri alan koduyla birlikte standart, yedi basamaklı ABD telefon numarası olarak görüntüleyen özel bir biçim dizesi tanımlar.
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
Standart biçim dizeleri genellikle uygulama tanımlı türleriniz için biçimlendirme gereksinimlerinin çoğunu işleyebilir, ancak türlerinizi biçimlendirmek için özel biçim tanımlayıcıları da tanımlayabilirsiniz.
Dizeleri ve .NET türlerini biçimlendirme
Tüm sayısal türler (yani Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64, ve BigIntegerDateTime türleri), ayrıca DateTimeOffset, TimeSpan, Guid ve tüm numaralandırma türleri, biçim dizeleriyle biçimlendirmeyi destekler. Her tür tarafından desteklenen belirli biçim dizeleri hakkında bilgi için aşağıdaki makalelere bakın:
| Başlık | Tanım |
|---|---|
| Standart Sayısal Biçim Dizeleri | Sayısal değerlerin yaygın olarak kullanılan dize gösterimlerini oluşturan standart biçim dizelerini açıklar. |
| Özel Sayısal Biçim Dizeleri | Sayısal değerler için uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Standart Tarih ve Saat Biçim Dizeleri | DateTime ve DateTimeOffset değerlerinin yaygın olarak kullanılan dize biçimlerini oluşturan standart biçim dizeleri açıklar. |
| Özel Tarih ve Saat Biçim Dizeleri | DateTime ve DateTimeOffset değerleri için uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Standart TimeSpan Biçim Dizeleri | Zaman aralıklarının yaygın olarak kullanılan dize gösterimlerini oluşturan standart biçim dizelerini açıklar. |
| Özel TimeSpan Biçim Dizeleri | Zaman aralıkları için uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Numaralandırma Biçim Dizeleri | Numaralandırma değerlerinin dize gösterimlerini oluşturmak için kullanılan standart biçim dizelerini açıklar. |
| Guid.ToString(String) | Değerler için Guid standart biçim dizelerini açıklar. |
Biçim sağlayıcılarıyla kültüre duyarlı biçimlendirme
Biçim tanımlayıcıları nesnelerin biçimlendirmesini özelleştirmenize izin verse de, nesnelerin anlamlı bir dize gösterimini oluşturmak için genellikle ek biçimlendirme bilgileri gerekir. Örneğin, "C" standart biçim dizesini veya "$ #,#.00" gibi özel bir biçim dizesini kullanarak bir sayıyı para birimi değeri olarak biçimlendirmek için, en azından doğru para birimi simgesi, grup ayırıcısı ve ondalık ayırıcı hakkında bilgilerin biçimlendirilmiş dizeye dahil edilebilecek şekilde olması gerekir. .NET'te bu ek biçimlendirme bilgileri, sayısal türlerin ve tarih ve saat türlerinin ToString yöntemine ait bir veya daha fazla aşırı yüklemeye parametre olarak sağlanan IFormatProvider arabirimi aracılığıyla erişilebilir hale getirilir.
IFormatProvider uygulamaları kültüre özgü biçimlendirmeyi desteklemek için .NET'te kullanılır. Aşağıdaki örnek, bir nesnenin farklı kültürleri temsil eden üç IFormatProvider nesneyle biçimlendirildiğinde dize gösteriminin nasıl değiştiğini gösterir.
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 €
Arabirim IFormatProvider , GetFormat(Type)biçimlendirme bilgileri sağlayan nesne türünü belirten tek bir parametreye sahip olan tek bir yöntemi içerir. Eğer yöntem bu tür bir nesne sağlayabilirse, onu döndürür. Aksi takdirde, boş başvuru döndürür (Nothing Visual Basic'te).
IFormatProvider.GetFormat bir geri çağırma yöntemidir.
ToString parametresi içeren bir IFormatProvider aşırı yüklemesini çağırdığınızda, bu GetFormat nesnesinin IFormatProvider yöntemini çağırır.
GetFormat yöntemi, formatType yöntemine, ToString parametresiyle belirtilen gerekli biçimlendirme bilgilerini sağlayan bir nesne döndürmekten sorumludur.
Çeşitli biçimlendirme veya dize dönüştürme yöntemleri IFormatProvider türünde bir parametre içerir, ancak çoğu durumda yöntem çağrıldığında bu parametrenin değeri dikkate alınmaz. Aşağıdaki tabloda, parametreyi kullanan biçimlendirme yöntemlerinden bazıları ve bu yöntemlerin Type yöntemine geçirdikleri IFormatProvider.GetFormat nesnesinin türü yer alıyor.
| Metot | Parametre türü formatType |
|---|---|
ToString sayısal türlerin yöntemi |
System.Globalization.NumberFormatInfo |
ToString tarih ve saat türleri yöntemi |
System.Globalization.DateTimeFormatInfo |
| String.Format | System.ICustomFormatter |
| StringBuilder.AppendFormat | System.ICustomFormatter |
Not
Sayısal ToString türlerin ve tarih ve saat türlerinin yöntemleri aşırı yüklenir ve yalnızca bazı aşırı yüklemeler bir IFormatProvider parametre içerir. Bir yöntemin türünde IFormatProvider bir parametresi yoksa, bunun yerine CultureInfo.CurrentCulture özelliği tarafından döndürülen nesne geçirilir. Örneğin, varsayılan Int32.ToString() yönteme yapılan bir çağrı, sonuç olarak aşağıdaki gibi bir yöntem çağrısına neden olur: Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture).
.NET, uygulayan IFormatProviderüç sınıf sağlar:
DateTimeFormatInfo, belirli bir kültür için tarih ve saat değerleri için biçimlendirme bilgileri sağlayan bir sınıf. Uygulaması IFormatProvider.GetFormat kendi örneğini geri döndürür.
NumberFormatInfo, belirli bir kültür için sayısal biçimlendirme bilgileri sağlayan bir sınıf. Uygulaması IFormatProvider.GetFormat kendi örneğini geri döndürür.
CultureInfo. Bu IFormatProvider.GetFormat uygulama, sayısal biçimlendirme bilgileri sağlamak amacıyla NumberFormatInfo nesnesi veya tarih ve saat değerleri için biçimlendirme bilgileri sağlamak amacıyla DateTimeFormatInfo nesnesi geri döndürebilir.
Bu sınıflardan herhangi birini değiştirmek için kendi biçim sağlayıcınızı da uygulayabilirsiniz. Ancak, GetFormat yöntemine biçimlendirme bilgileri sağlaması gerekiyorsa, uygulamanızın ToString yöntemi önceki tabloda listelenen türde bir nesne döndürmelidir.
Sayısal değerlerin kültüre duyarlı biçimlendirmesi
Varsayılan olarak, sayısal değerlerin biçimlendirmesi kültüre duyarlıdır. Biçimlendirme yöntemini çağırdığınızda bir kültür belirtmezseniz, geçerli kültürün biçimlendirme kuralları kullanılır. Bu durum, geçerli kültürü dört kez değiştiren ve ardından Decimal.ToString(String) yöntemini çağıran aşağıdaki örnekte gösterilmiştir. Her durumda, sonuç dizesi geçerli kültürün biçimlendirme kurallarını yansıtır. Bunun nedeni, ToString ve ToString(String) yöntemlerinin, her sayısal türün ToString(String, IFormatProvider) yöntemine yapılan çağrıları sarmalamasıdır.
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 €
Belirli bir kültür için sayısal değeri ToString parametresi olan bir aşırı yüklemeyi çağırarak ve provider parametresi ile aşağıdakilerden birini geçirerek biçimlendirebilirsiniz.
CultureInfo Biçimlendirme kuralları kullanılacak olan kültürü temsil eden nesne. yöntemi CultureInfo.GetFormat , sayısal değerler için kültüre CultureInfo.NumberFormat özgü biçimlendirme bilgileri sağlayan nesne olan NumberFormatInfo özelliğinin değerini döndürür.
NumberFormatInfo Kullanılacak kültüre özgü biçimlendirme kurallarını tanımlayan nesne. Bu GetFormat yöntemi kendi örneğini döndürür.
Aşağıdaki örnek, kayan noktalı bir sayıyı biçimlendirmek için İngilizce (Birleşik Devletler) ve İngilizce (Birleşik Krallık) kültürlerini ve Fransızca ve Rusça nötr kültürlerini temsil eden nesneleri kullanırNumberFormatInfo.
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
Tarih ve saat değerlerinin kültüre duyarlı biçimlendirmesi
Varsayılan olarak, tarih ve saat değerlerinin biçimlendirmesi kültüre duyarlıdır. Biçimlendirme yöntemini çağırdığınızda bir kültür belirtmezseniz, geçerli kültürün biçimlendirme kuralları kullanılır. Bu durum, geçerli kültürü dört kez değiştiren ve ardından DateTime.ToString(String) yöntemini çağıran aşağıdaki örnekte gösterilmiştir. Her durumda, sonuç dizesi geçerli kültürün biçimlendirme kurallarını yansıtır. Bunun nedeni, DateTime.ToString(), DateTime.ToString(String), DateTimeOffset.ToString() ve DateTimeOffset.ToString(String) yöntemlerinin, DateTime.ToString(String, IFormatProvider) ve DateTimeOffset.ToString(String, IFormatProvider) yöntemlerine yapılan çağrıları sarmalamasıdır.
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
Ayrıca, parametre içeren DateTime.ToString veya DateTimeOffset.ToString aşırı yüklemesini çağırarak ve provider parametresini ya da aşağıdakilerden birini geçirerek, belirli bir kültür için tarih ve saat değerini formatlayabilirsiniz.
CultureInfo Biçimlendirme kuralları kullanılacak olan kültürü temsil eden nesne. CultureInfo.GetFormat yöntemi, kültürel olarak belirli tarih ve saat biçimlendirme bilgileri sağlayan CultureInfo.DateTimeFormat nesnesi olan DateTimeFormatInfo özelliğinin değerini döndürür.
DateTimeFormatInfo Kullanılacak kültüre özgü biçimlendirme kurallarını tanımlayan nesne. Bu GetFormat yöntemi kendi örneğini döndürür.
Aşağıdaki örnek, bir tarihi biçimlendirmek için İngilizce (Birleşik Devletler) ve İngilizce (Birleşik Krallık) kültürlerini ve Fransızca ve Rusça nötr kültürlerini temsil eden nesneleri kullanırDateTimeFormatInfo.
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
IFormattable arabirimi
Genellikle, bir biçim dizesi ve ToString parametresi ile IFormatProvider yöntemini aşırı yükleyen türler, IFormattable arabirimini de uygular. Bu arabirimin, IFormattable.ToString(String, IFormatProvider)parametre olarak hem biçim dizesini hem de biçim sağlayıcısını içeren tek bir üyesi vardır.
Uygulama tanımlı sınıfınız için arabirimi uygulamak IFormattable iki avantaj sunar:
Convert sınıfı tarafından sağlanan dize dönüştürme desteği. Convert.ToString(Object) ve Convert.ToString(Object, IFormatProvider) yöntemlerine yapılan çağrılar, IFormattable uygulamanızı otomatik olarak çağırır.
Bileşik biçimlendirme desteği. Özel türünüzü biçimlendirmek için biçim dizesi içeren bir biçim öğesi kullanıldığında, ortak dil çalışma zamanı, IFormattable uygulamanızı otomatik olarak çağırır ve biçim dizesini ona iletir. veya gibi String.Format yöntemlerle bileşik biçimlendirme hakkında daha fazla bilgi için Bileşik BiçimlendirmeConsole.WriteLine.
Aşağıdaki örnek, Temperature sınıfını ve IFormattable arabirimini uygulayan bir sınıfı tanımlar. Sıcaklığı santigrat cinsinden görüntülemek için "C" veya "G" biçim tanımlayıcılarını, Fahrenheit'te sıcaklığı görüntülemek için "F" biçim tanımlayıcısını ve Kelvin'de sıcaklığı görüntülemek için "K" biçim tanımlayıcısını destekler.
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
Aşağıdaki örnek bir Temperature nesnesini örnekler. Ardından yöntemini çağırır ve bir ToString nesnenin Temperature farklı dize gösterimlerini elde etmek için çeşitli bileşik biçim dizeleri kullanır. Bu yöntem çağrılarının her biri sırayla IFormattable sınıfının Temperature uygulamasını çağırır.
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: {temp:K}");
Console.WriteLine($"Temperature: {temp:F}");
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
Bileşik biçimlendirme
String.Format ve StringBuilder.AppendFormat gibi bazı yöntemler bileşik biçimlendirmeyi destekler. Bileşik biçim dizesi sıfır, bir veya daha fazla nesnenin dize gösterimini içeren tek bir dize döndüren bir şablon türüdür. Her nesne bileşik biçim dizesinde dizinlenmiş biçim öğesiyle gösterilir. Biçim öğesinin dizini, yönteminin parametre listesinde temsil ettiği nesnenin konumuna karşılık gelir. Dizinler sıfır tabanlıdır. Örneğin, yöntemine String.Format yapılan aşağıdaki çağrıda, ilk biçim öğesi {0:D}, öğesinin thatDatedize gösterimiyle değiştirilir; ikinci biçim öğesi {1}, öğesinin item1dize gösterimiyle, üçüncü biçim öğesi {2:C2}ise öğesinin item1.Valuedize gösterimiyle değiştirilir.
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.
Biçim öğesini karşılık gelen nesnesinin dize gösterimiyle değiştirmenin yanı sıra, biçim öğeleri de aşağıdakileri denetlemenize olanak sağlar:
Bir nesne IFormattable arabirimini uyguluyorsa ve biçim dizelerini destekliyorsa, bu nesnenin bir dize olarak temsil edilme şekli. Bunu, biçim öğesinin dizinini geçerli bir
:biçim dizesiyle (iki nokta üst üste) takip ederek yaparsınız. Önceki örnekte, bir tarih değerini "d" (kısa tarih deseni) biçim dizesiyle (örneğin,{0:d}) biçimlendirerek ve sayıyı iki kesirli ondalık basamağı olan bir para birimi değeri olarak göstermek üzere "C2" biçim dizesiyle (örneğin,{2:C2}) sayısal bir değeri biçimlendirerek bunu yapmıştır.Nesnenin dize gösterimini içeren alanın genişliği ve bu alandaki dize gösteriminin hizalaması. Bunu, biçim öğesinin dizinini bir
,(virgül) ve ardından gelen alan genişliği ile takip ederek yaparsınız. Alan genişliği pozitif bir değerse dize alanda sağa hizalanır ve alan genişliği negatif bir değerse sola hizalanır. Aşağıdaki örnek, 20 karakterlik bir alandaki tarih değerlerini sola hizalar ve ondalık değerleri 11 karakterlik bir alanda bir kesirli basamakla sağa hizalar.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.2Dim 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.2Hem hizalama dizesi bileşeni hem de biçim dizesi bileşeni varsa, ilki ikinciden önce (örneğin,
{0,-20:g}).
Bileşik biçimlendirme hakkında daha fazla bilgi için bkz . Bileşik Biçimlendirme.
ICustomFormatter ile özel biçimlendirme
ve olmak üzere iki bileşik biçimlendirme yöntemi, String.Format(IFormatProvider, String, Object[])StringBuilder.AppendFormat(IFormatProvider, String, Object[])özel biçimlendirmeyi destekleyen bir biçim sağlayıcısı parametresi içerir. Bu biçimlendirme yöntemlerinden biri çağrıldığında, bir Type nesnesi, bir ICustomFormatter arabirimini temsil ederek biçim sağlayıcısının GetFormat yöntemine geçirilir. GetFormat yöntemi, daha sonra özel biçimlendirme sağlayan ICustomFormatter uygulamasını döndürmekten sorumludur.
Arayüz ICustomFormatter, Format(String, Object, IFormatProvider) adlı otomatik olarak çağrılan tek bir yönteme sahiptir; bu yöntem, bileşik biçim dizesindeki her biçim öğesi için bileşik biçimlendirme yöntemi tarafından bir kez çağrılır. yönteminin Format(String, Object, IFormatProvider) üç parametresi vardır: bir biçim öğesindeki bağımsız değişkeni temsil formatString eden bir biçim dizesi, biçimlendirilen bir nesne ve biçimlendirme hizmetleri sağlayan bir IFormatProvider nesne. Genellikle, uygulayan ICustomFormatter sınıf da uygular IFormatProvider, bu nedenle bu son parametre özel biçimlendirme sınıfının kendisine bir başvurudur. yöntemi, biçimlendirilecek nesnenin özel biçimlendirilmiş dize gösterimini döndürür. Yöntem nesneyi biçimlendiremezse, null referans geri döndürmelidir (Nothing Visual Basic'te).
Aşağıdaki örnek, tamsayı değerlerini iki basamaklı onaltılık değerlerin ve ardından boşluk dizisi olarak görüntüleyen adlı ICustomFormatter bir uygulama sağlarByteByByteFormatter.
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 is not null) && !formatProvider.Equals(this)) return "";
// Handle only hexadecimal format string.
if ((format is not null) && !format.StartsWith("X")) return "";
byte[] bytes;
// Handle only integral types.
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 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 "";
string output= "";
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
Aşağıdaki örnek, tamsayı değerlerini biçimlendirmek için sınıfını ByteByByteFormatter kullanır. Metot ICustomFormatter.Format, ikinci String.Format(IFormatProvider, String, Object[]) metot çağrısında birden fazla kez çağrılır ve varsayılan NumberFormatInfo sağlayıcı üçüncü metot çağrısında kullanılır çünkü.
ByteByByteFormatter.Format yöntemi "N0" biçim dizesini tanımaz ve null başvuru döndürür (Nothing Visual Basic'te).
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
Ayrıca bkz.
| Başlık | Tanım |
|---|---|
| Standart Sayısal Biçim Dizeleri | Sayısal değerlerin yaygın olarak kullanılan dize gösterimlerini oluşturan standart biçim dizelerini açıklar. |
| Özel Sayısal Biçim Dizeleri | Sayısal değerler için uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Standart Tarih ve Saat Biçim Dizeleri | Yaygın olarak kullanılan DateTime değerlerinin dize gösterimlerini oluşturan standart biçim dizelerini açıklar. |
| Özel Tarih ve Saat Biçim Dizeleri | Değerler için DateTime uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Standart TimeSpan Biçim Dizeleri | Zaman aralıklarının yaygın olarak kullanılan dize gösterimlerini oluşturan standart biçim dizelerini açıklar. |
| Özel TimeSpan Biçim Dizeleri | Zaman aralıkları için uygulamaya özgü biçimler oluşturan özel biçim dizelerini açıklar. |
| Numaralandırma Biçim Dizeleri | Numaralandırma değerlerinin dize gösterimlerini oluşturmak için kullanılan standart biçim dizelerini açıklar. |
| Bileşik Biçimlendirme | Bir dizeye bir veya daha fazla biçimlendirilmiş değerin nasıl eklenip eklenmediği açıklanır. Dize daha sonra konsolda görüntülenebilir veya bir akışa yazılabilir. |
| Dizeleri Ayrıştırma | Nesnelerin, bu nesnelerin dize gösterimleriyle açıklanan değerlere nasıl başlatıldığını açıklar. Ayrıştırma, biçimlendirmenin ters işlemidir. |