IFormatProviderは何をしますか?


回答:


61

イアン・ボイドの答えに加えて:

また、CultureInfoこのインターフェースを実装し、あなたのケースで使用することができます。たとえば、フランスの日付文字列を解析できます。あなたは使うことができます

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);

2
.NET Framework 4.6の例に一致するオーバーロードはもうないようです。DateTime.ParseExact(string, string, IFormatProvider)代わりに使用する必要があります。つまり、 DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
James King

1
.NET Framework 4.6.2では、指定したとおりの入力パラメーターはありません。私は2つしか使用していませんが、問題なく動作しDateTime dt = DateTime.Parse(yourDateInputString, ci);ます。回答を修正してください。
開発者

1
申し訳ありませんが、私の回答に対して長い間遅れていた更新が行われました。
AndreiRînea18年

49

IFormatProviderインタフェースは、通常であなたのために実装されCultureInfoたクラス、例えば:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

このインターフェースは、カルチャーから一連のカルチャー固有のデータを取得する関数のゲートウェイです。IFormatProviderクエリを実行できる2つの一般的に利用可能なカルチャオブジェクトは次のとおりです。

それが通常動作する方法はIFormatProvider、あなたにDateTimeFormatInfoオブジェクトを与えるように依頼することです:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

また、IFormatProviderから派生したクラスCultureInfo、またはから派生したクラスによってインターフェイスが実装されている可能性が高いDateTimeFormatInfoため、インターフェイスを直接キャストできるという内部知識もあります。

CultureInfo info = provider as CultureInfo;
if (info != null)
   format = info.DateTimeInfo;
else
{
   DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
   if (dtfi != null)
       format = dtfi;
   else
       format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}

if (format != null)
   DoStuffWithDatesOrTimes(format);

しかし、それをしないでください

そのハードワークはすべてあなたのためにすでに書かれています:

からを取得するDateTimeFormatInfoにはIFormatProvider

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

からを取得するNumberFormatInfoにはIFormatProvider

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

の価値はIFormatProvider、独自のカルチャーオブジェクトを作成することです。それらがを実装しIFormatProvider、要求されたオブジェクトを返す限り、組み込みのカルチャをバイパスできます。

IFormatProvider介して任意のカルチャオブジェクトを渡す方法にも使用できますIFormatProvider。たとえば、異なる文化の神の名前

  • エホバ
  • ヤーウェ
  • יהוה
  • אהיהאשראהיה

これにより、カスタムLordsNameFormatInfoクラスを内に配置IFormatProviderでき、イディオムを保持できます。

実際にはGetFormatIFormatProvider自分のメソッドを呼び出す必要はありません。

必要なときはいつでもオブジェクトIFormatProviderを渡すことができCultureInfoます:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

:すべてのコードはパブリックドメインにリリースされます。帰属は必要ありません。


18

nullを渡すのIFormatProviderは、これを行う正しい方法ではありません。ユーザーが自分のPCでカスタムの日付/時刻形式を使用している場合、解析および文字列への変換に問題があります。文字列に変換するときに、誰かがIFormatProviderとしてnullを渡していたバグを修正しました。

代わりに使用する必要があります CultureInfo.InvariantCulture

違う:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

正しい:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);

2
CultureInfo.InvariantCulture代わりに使用する理由はありますCultureInfo.CurrentCultureか?
Stephen Booher 2013年

5
InvariantCultureは特別なカルチャであり、常にすべてのマシンに存在することが保証されており、常に同じ値に変換および解析されます。CurrentCultureは、現在のスレッドのカルチャです。これは異なる場合があり、同じカルチャを使用して文字列に変換して解析しないと、フォーマットエラーが発生します...
Tim

5
@StephenBooherを渡すと、nullデフォルトでになりますCultureInfo.CurrentCulture。参照ソースの呼び出しを参照してください。呼び出しのチェーンをたどると、最終的にnull DateTimeFormatInfo.CurrentInfoは、CultureInfo.CurrentCulture出力と同等に置き換えられます。
Scott Chamberlain

InvariantCultureは私が探していたものです。ありがとう
Chicowitz




2

MSDN

.NET Frameworkには、数値と日付と時刻の値のフォーマットまたは解析に使用されるカルチャ固有の情報を提供するために、次の3つの定義済みIFormatProvider実装が含まれています。

  1. NumberFormatInfo特定の培養のためにそのような通貨としてフォーマット番号や、数千の分離、および小数点区切り記号に使用される情報を提供するクラス。NumberFormatInfoオブジェクトによって認識され、数値のフォーマット操作で使用される定義済みのフォーマット文字列については、「標準の数値フォーマット文字列」および「カスタム数値フォーマット文字列」を参照してください。
  2. このDateTimeFormatInfoクラスは、特定のカルチャの日付と時刻の区切り記号や、日付の年、月、日のコンポーネントの順序と形式など、日付と時刻の形式に使用される情報を提供します。DateTimeFormatInfoオブジェクトによって認識され、数値のフォーマット操作で使用される定義済みのフォーマット文字列については、「標準の日付と時間のフォーマット文字列」と「カスタムの日付と時間のフォーマット文字列」を参照してください。
  3. CultureInfo特定の文化を表すクラス、。そのGetFormatメソッドは、数値または日付と時刻を含むフォーマットまたは解析操作でオブジェクトが使用されているかどうかに応じて、カルチャ固有NumberFormatInfoまたはDateTimeFormatInfoオブジェクトを返しますCultureInfo

.NET Frameworkは、カスタムフォーマットもサポートしています。これには通常、IFormatProviderとICustomFormatterの両方を実装するフォーマットクラスの作成が含まれます。次に、このクラスのインスタンスは、などのカスタム書式設定操作を実行するメソッドにパラメータとして渡されますString.Format(IFormatProvider, String, Object[])


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.