IFormatProvider インターフェイス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
書式設定を制御するオブジェクトを取得するためのメカニズムを定義します。
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
- 派生
- 属性
例
次の例は、実装によって IFormatProvider 日付と時刻の値の表現を変更する方法を示しています。 この場合、4 つの異なるカルチャを表すオブジェクトを使用して CultureInfo 、1 つの日付が表示されます。
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
次の例は、インターフェイスとメソッドを実装するクラスの使用をIFormatProviderGetFormat示しています。 このクラスは AcctNumberFormat
、アカウント番号を Int64 表す値を書式設定された 12 桁のアカウント番号に変換します。 パラメーターが実装するクラスを参照している場合、そのGetFormat
メソッドは現在AcctNumberFormat
のformatType
インスタンスへの参照を返します。それ以外のnull
場合は、 GetFormat
.ICustomFormatter
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
その後、実装 IFormatProvider するクラスは、書式設定および解析操作の呼び出しで使用できます。 たとえば、次のコードはメソッドを String.Format(IFormatProvider, String, Object[]) 呼び出して、書式設定された 12 桁のアカウント番号を含む文字列を生成します。
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.
注釈
インターフェイスは IFormatProvider 、書式設定および解析操作の書式設定情報を提供するオブジェクトを提供します。 書式設定操作では、型の値をその値の文字列表現に変換します。 一般的な書式設定メソッドは ToString
、型のメソッドと Format同様です。 解析操作は、値の文字列表現を、その値を持つ型に変換します。 一般的な解析方法は Parse
次のとおりです TryParse
。
インターフェイスは IFormatProvider 、 IFormatProvider.GetFormat1 つのメソッドで構成されます。 GetFormat はコールバック メソッドです。解析メソッドまたは書式設定メソッドは、それを呼び出し、書式設定または解析メソッドが書式設定情報を提供するオブジェクトの種類を表すオブジェクトを渡 Type します。 メソッドは GetFormat 、その型のオブジェクトを返す役割を担います。
IFormatProvider 実装は、多くの場合、メソッドの書式設定と解析によって暗黙的に使用されます。 たとえば、メソッドは、システムの DateTime.ToString(String) 現在のカルチャを IFormatProvider 表す実装を暗黙的に使用します。 IFormatProvider実装は、次のようなInt32.Parse(String, IFormatProvider)String.Format(IFormatProvider, String, Object[])型IFormatProviderのパラメーターを持つメソッドによって明示的に指定することもできます。
.NET Frameworkには、数値と日付と時刻の値の書式設定または解析に使用されるカルチャ固有の情報を提供するために、次の 3 つの定義済みのIFormatProvider実装が含まれています。
クラス。特定の NumberFormatInfo カルチャの通貨、桁区切り記号、小数点記号などの数値の書式設定に使用される情報を提供します。 オブジェクトによって NumberFormatInfo 認識され、数値書式指定操作で使用される定義済みの書式指定文字列については、「 標準の数値書式指定文字列 」および 「カスタム数値書式指定文字列」を参照してください。
特定の DateTimeFormatInfo カルチャの日付と時刻の区切り記号、日付の年、月、および日のコンポーネントの順序と書式など、日付と時刻の書式設定に使用される情報を提供するクラス。 オブジェクトによって DateTimeFormatInfo 認識され、数値書式指定操作で使用される定義済みの書式指定文字列については、「 標準の日付と時刻の書式指定文字列」および 「 ユーザー設定の日付と時刻の書式指定文字列」を参照してください。
特定の CultureInfo カルチャを表すクラス。 そのメソッドはGetFormat、数値または日付と時刻を含む書式設定またはDateTimeFormatInfo解析操作でオブジェクトが使用されているかどうかCultureInfoに応じて、カルチャ固有NumberFormatInfoまたはオブジェクトを返します。
.NET Frameworkでは、カスタム書式設定もサポートされています。 これには通常、両方 IFormatProvider を実装する書式設定クラスの作成が ICustomFormatter含まれます。 このクラスのインスタンスは、カスタム書式設定操作を実行するメソッドにパラメーターとして渡されます。たとえば String.Format(IFormatProvider, String, Object[]) 、この例では、数値を 12 桁のアカウント番号として書式設定するこのようなカスタム実装の図を示します。
メソッド
GetFormat(Type) |
指定した型の書式指定サービスを提供するオブジェクトを返します。 |