IFormatProvider Schnittstelle
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt einen Mechanismus zum Abrufen eines Objekts für die Formatierungssteuerung bereit.
public interface class IFormatProvider
public interface IFormatProvider
[System.Runtime.InteropServices.ComVisible(true)]
public interface IFormatProvider
type IFormatProvider = interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type IFormatProvider = interface
Public Interface IFormatProvider
- Abgeleitet
- Attribute
Beispiele
Im folgenden Beispiel wird veranschaulicht, wie eine IFormatProvider Implementierung die Darstellung eines Datums- und Uhrzeitwerts ändern kann. In diesem Fall wird ein einzelnes Datum mithilfe CultureInfo von Objekten angezeigt, die vier verschiedene Kulturen darstellen.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
DateTime dateValue = new DateTime(2009, 6, 1, 16, 37, 0);
CultureInfo[] cultures = { new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("it-IT"),
new CultureInfo("de-DE") };
foreach (CultureInfo culture in cultures)
Console.WriteLine("{0}: {1}", culture.Name, dateValue.ToString(culture));
}
}
// The example displays the following output:
// en-US: 6/1/2009 4:37:00 PM
// fr-FR: 01/06/2009 16:37:00
// it-IT: 01/06/2009 16.37.00
// de-DE: 01.06.2009 16:37:00
open System
open System.Globalization
let dateValue = DateTime(2009, 6, 1, 16, 37, 0)
let cultures =
[ CultureInfo "en-US"
CultureInfo "fr-FR"
CultureInfo "it-IT"
CultureInfo "de-DE" ]
for culture in cultures do
printfn $"{culture.Name}: {dateValue.ToString culture}"
// The example displays the following output:
// en-US: 6/1/2009 4:37:00 PM
// fr-FR: 01/06/2009 16:37:00
// it-IT: 01/06/2009 16.37.00
// de-DE: 01.06.2009 16:37:00
Imports System.Globalization
Module Example
Public Sub Main()
Dim dateValue As Date = #06/01/2009 4:37PM#
Dim cultures() As CultureInfo = {New CultureInfo("en-US"), _
New CultureInfo("fr-FR"), _
New CultureInfo("it-IT"), _
New CultureInfo("de-DE") }
For Each culture As CultureInfo In cultures
Console.WriteLine("{0}: {1}", culture.Name, dateValue.ToString(culture))
Next
End Sub
End Module
' The example displays the following output:
' en-US: 6/1/2009 4:37:00 PM
' fr-FR: 01/06/2009 16:37:00
' it-IT: 01/06/2009 16.37.00
' de-DE: 01.06.2009 16:37:00
Im folgenden Beispiel wird die Verwendung einer Klasse veranschaulicht, die die IFormatProvider Schnittstelle und die GetFormat Methode implementiert. Die AcctNumberFormat
Klasse konvertiert einen Wert, der eine Int64 Kontonummer in eine formatierte 12-stellige Kontonummer darstellt. Die GetFormat
Methode gibt einen Verweis auf die aktuelle AcctNumberFormat
Instanz zurück, wenn der formatType
Parameter auf eine Klasse verweist, die implementiert wird; andernfalls ICustomFormatterGetFormat
wird zurückgegebennull
.
public class AcctNumberFormat : IFormatProvider, ICustomFormatter
{
private const int ACCT_LENGTH = 12;
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string fmt, object arg, IFormatProvider formatProvider)
{
// Provide default formatting if arg is not an Int64.
if (arg.GetType() != typeof(Int64))
try {
return HandleOtherFormats(fmt, arg);
}
catch (FormatException e) {
throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
}
// Provide default formatting for unsupported format strings.
string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
if (! (ufmt == "H" || ufmt == "I"))
try {
return HandleOtherFormats(fmt, arg);
}
catch (FormatException e) {
throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
}
// Convert argument to a string.
string result = arg.ToString();
// If account number is less than 12 characters, pad with leading zeroes.
if (result.Length < ACCT_LENGTH)
result = result.PadLeft(ACCT_LENGTH, '0');
// If account number is more than 12 characters, truncate to 12 characters.
if (result.Length > ACCT_LENGTH)
result = result.Substring(0, ACCT_LENGTH);
if (ufmt == "I") // Integer-only format.
return result;
// Add hyphens for H format specifier.
else // Hyphenated format.
return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
else if (arg != null)
return arg.ToString();
else
return String.Empty;
}
}
open System
open System.Globalization
type AcctNumberFormat() =
let [<Literal>] ACCT_LENGTH = 12
interface IFormatProvider with
member this.GetFormat(formatType: Type) =
if formatType = typeof<ICustomFormatter> then
this
else
null
interface ICustomFormatter with
member this.Format(fmt: string, arg: obj, formatProvider: IFormatProvider) =
// Provide default formatting if arg is not an Int64.
// Provide default formatting for unsupported format strings.
let ufmt = fmt.ToUpper CultureInfo.InvariantCulture
if arg.GetType() = typeof<Int64> && (ufmt = "H" || ufmt = "I") then
// Convert argument to a string.
let result = string arg
let result =
// If account number is less than 12 characters, pad with leading zeroes.
if result.Length < ACCT_LENGTH then
result.PadLeft(ACCT_LENGTH, '0')
else result
let result =
// If account number is more than 12 characters, truncate to 12 characters.
if result.Length > ACCT_LENGTH then
result.Substring(0, ACCT_LENGTH)
else result
// Integer-only format.
if ufmt = "I" then
result
// Add hyphens for H format specifier.
else // Hyphenated format.
result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8)
else
try
this.HandleOtherFormats(fmt, arg)
with :? FormatException as e ->
raise (FormatException($"The format of '{fmt}' is invalid.", e))
member _.HandleOtherFormats(format: string, arg: obj) =
match arg with
| :? IFormattable as arg ->
arg.ToString(format, CultureInfo.CurrentCulture)
| null ->
string arg
| _ ->
String.Empty
Public Class AcctNumberFormat : Implements IFormatProvider, ICustomFormatter
Private Const ACCT_LENGTH As Integer = 12
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
' Provide default formatting if arg is not an Int64.
If Not TypeOf arg Is Int64 Then
Try
Return HandleOtherFormats(fmt, arg)
Catch e As FormatException
Throw New FormatException(String.Format("The format of '{0}' is invalid.", fmt), e)
End Try
End If
' Provider default formatting for unsupported format strings.
Dim ufmt As String = fmt.ToUpper(CultureInfo.InvariantCulture)
If Not (ufmt = "H" Or ufmt = "I") Then
Try
Return HandleOtherFormats(fmt, arg)
Catch e As FormatException
Throw New FormatException(String.Format("The format of '{0}' is invalid.", fmt), e)
End Try
End If
' Convert argument to a string.
Dim result As String = arg.ToString()
' If account number is less than 12 characters, pad with leading zeroes.
If result.Length < ACCT_LENGTH Then result = result.PadLeft(ACCT_LENGTH, "0"c)
' If account number is more than 12 characters, truncate to 12 characters.
If result.Length > ACCT_LENGTH Then result = Left(result, ACCT_LENGTH)
If ufmt = "I" ' Integer-only format.
Return result
' Add hyphens for H format specifier.
Else ' Hypenated format.
Return Left(result, 5) & "-" & Mid(result, 6, 3) & "-" & Right(result, 4)
End If
End Function
Private Function HandleOtherFormats(fmt As String, arg As Object) As String
If TypeOf arg Is IFormattable Then
Return DirectCast(arg, IFormattable).ToString(fmt, CultureInfo.CurrentCulture)
ElseIf arg IsNot Nothing Then
Return arg.ToString()
Else
Return String.Empty
End If
End Function
End Class
Die Klasse, die implementiert wird, kann dann in einem Aufruf zu einem Formatierungs IFormatProvider - und Analysevorgang verwendet werden. Der folgende Code ruft beispielsweise die Methode auf, um eine Zeichenfolge zu generieren, die String.Format(IFormatProvider, String, Object[]) eine formatierte 12-stellige Kontonummer enthält.
using System;
using System.Globalization;
public enum DaysOfWeek { Monday=1, Tuesday=2 };
public class TestFormatting
{
public static void Main()
{
long acctNumber;
double balance;
DaysOfWeek wday;
string output;
acctNumber = 104254567890;
balance = 16.34;
wday = DaysOfWeek.Monday;
output = String.Format(new AcctNumberFormat(),
"On {2}, the balance of account {0:H} was {1:C2}.",
acctNumber, balance, wday);
Console.WriteLine(output);
wday = DaysOfWeek.Tuesday;
output = String.Format(new AcctNumberFormat(),
"On {2}, the balance of account {0:I} was {1:C2}.",
acctNumber, balance, wday);
Console.WriteLine(output);
}
}
// The example displays the following output:
// On Monday, the balance of account 10425-456-7890 was $16.34.
// On Tuesday, the balance of account 104254567890 was $16.34.
open System
open System.Globalization
type DaysOfWeek = Monday = 1 | Tuesday = 2
[<EntryPoint>]
let main _ =
let acctNumber = 104254567890L
let balance = 16.34
let wday = DaysOfWeek.Monday
let output =
String.Format(AcctNumberFormat(),
"On {2}, the balance of account {0:H} was {1:C2}.",
acctNumber, balance, wday)
printfn $"{output}"
let wday = DaysOfWeek.Tuesday
let output =
String.Format(AcctNumberFormat(),
"On {2}, the balance of account {0:I} was {1:C2}.",
acctNumber, balance, wday)
printfn $"{output}"
0
// The example displays the following output:
// On Monday, the balance of account 10425-456-7890 was $16.34.
// On Tuesday, the balance of account 104254567890 was $16.34.
Imports System.Globalization
Public Enum DaysOfWeek As Long
Monday = 1
Tuesday = 2
End Enum
Module TestFormatting
Public Sub Main()
Dim acctNumber As Long, balance As Double
Dim wday As DaysOfWeek
Dim output As String
acctNumber = 104254567890
balance = 16.34
wday = DaysOfWeek.Monday
output = String.Format(New AcctNumberFormat(), "On {2}, the balance of account {0:H} was {1:C2}.", acctNumber, balance, wday)
Console.WriteLine(output)
wday = DaysOfWeek.Tuesday
output = String.Format(New AcctNumberFormat(), "On {2}, the balance of account {0:I} was {1:C2}.", acctNumber, balance, wday)
Console.WriteLine(output)
End Sub
End Module
' The example displays the following output:
' On Monday, the balance of account 10425-456-7890 was $16.34.
' On Tuesday, the balance of account 104254567890 was $16.34.
Hinweise
Die IFormatProvider Schnittstelle stellt ein Objekt bereit, das Formatierungsinformationen für Formatierungs- und Analysevorgänge bereitstellt. Formatierungsvorgänge konvertieren den Wert eines Typs in die Zeichenfolgendarstellung dieses Werts. Typische Formatierungsmethoden sind die ToString
Methoden eines Typs sowie Format. Die Analysevorgänge konvertieren die Zeichenfolgendarstellung eines Werts in einen Typ mit diesem Wert. Typische Analysemethoden sind Parse
und TryParse
.
Die IFormatProvider Schnittstelle besteht aus einer einzigen Methode, IFormatProvider.GetFormat. GetFormat ist eine Rückrufmethode: Die Analyse- oder Formatierungsmethode ruft sie auf und übergibt es ein Type Objekt, das den Typ des Objekts darstellt, den die Formatierungs- oder Analysemethode erwartet, formatierungsinformationen bereitstellt. Die GetFormat Methode ist dafür verantwortlich, ein Objekt dieses Typs zurückzugeben.
IFormatProvider Implementierungen werden häufig implizit durch Formatierung und Analysemethoden verwendet. Die Methode verwendet beispielsweise DateTime.ToString(String) implizit eine IFormatProvider Implementierung, die die aktuelle Kultur des Systems darstellt. IFormatProvider Implementierungen können auch explizit durch Methoden angegeben werden, die einen Parameter vom Typ IFormatProviderhaben, z Int32.Parse(String, IFormatProvider) . B. und String.Format(IFormatProvider, String, Object[]).
Die .NET Framework enthält die folgenden drei vordefinierten IFormatProvider Implementierungen, um kulturspezifische Informationen bereitzustellen, die in der Formatierung oder Analyse numerischer und Datums- und Uhrzeitwerte verwendet werden:
Die NumberFormatInfo Klasse, die Informationen bereitstellt, die zum Formatieren von Zahlen verwendet werden, z. B. die Währung, das Tausendertrennzeichen und dezimale Trennzeichen für eine bestimmte Kultur. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem NumberFormatInfo Objekt erkannt werden und in numerischen Formatierungsvorgängen verwendet werden, finden Sie unter Standard numerische Formatzeichenfolgen und benutzerdefinierte numerische Formatzeichenfolgen.
Die DateTimeFormatInfo Klasse, die Informationen bereitstellt, die verwendet werden, um Datums- und Uhrzeittrennzeichen für eine bestimmte Kultur oder das Format der Jahres-, Monats- und Tageskomponenten eines Datums zu formatieren. Informationen zu den vordefinierten Formatzeichenfolgen, die von einem DateTimeFormatInfo Objekt erkannt werden und in numerischen Formatierungsvorgängen verwendet werden, finden Sie unter "Standarddatums- und Uhrzeitformatzeichenfolgen" und "Benutzerdefinierte Datums- und Uhrzeitformatzeichenfolgen".
Die Klasse, die CultureInfo eine bestimmte Kultur darstellt. Die GetFormat Methode gibt ein kulturspezifisches NumberFormatInfo DateTimeFormatInfo oder Objekt zurück, je nachdem, ob das CultureInfo Objekt in einem Formatierungs- oder Analysevorgang verwendet wird, der Zahlen oder Datumsangaben und Uhrzeiten umfasst.
Die .NET Framework unterstützt auch benutzerdefinierte Formatierungen. Dies umfasst in der Regel die Erstellung einer Formatierungsklasse, die sowohl IFormatProvider ICustomFormatterals auch . Eine Instanz dieser Klasse wird dann als Parameter an eine Methode übergeben, die einen benutzerdefinierten Formatierungsvorgang ausführt, z String.Format(IFormatProvider, String, Object[]) . B. Das Beispiel stellt eine Abbildung einer solchen benutzerdefinierten Implementierung bereit, die eine Zahl als 12-stellige Kontonummer formatiert.
Methoden
GetFormat(Type) |
Gibt ein Objekt zurück, das Formatierungsdienste für den angegebenen Typ bereitstellt. |