私は .Net Core 6 ライブラリ (dll) の一部を使用しています。このライブラリでは、他の機能の中でも、数値と日付/時刻情報が文字列として出力され、このコードをグローバル化する必要があります。文化を意識すること。ライブラリはドキュメント作成システム用であるため、同じアプリケーション セッションで、ユーザーは de-CH、de-FR、en-US などのドキュメントを作成します。出力されるカルチャは、オペレーティング システム レベルまたはユーザー レベルでカスタマイズされたものではなく、「標準」形式である必要があります。
たとえば、10 進数値の場合、ライブラリ コードは次のメソッドを使用して出力します。
public string ToString();
public string ToString(string? format);
public string ToString(IFormatProvider? provider)
public string ToString(string? format, IFormatProvider? provider)
したがって、異なるカルチャ設定を持つ異なるコンピューターの異なるユーザーがこれらのオーバーロードを呼び出すと、出力の形式が異なります。
ただし、provider
「fr-CH」(スイス-フランス語) などの特定のカルチャのインスタンスを使用して引数が明示的に渡され、CultureInfo.UseUserOverride == false が指定されている場合、ユーザーおよび/に関係なく、常に同じ出力文字列が期待されていました。またはコンピューター。したがって、.Net はすべてのカルチャ タイプの CultureInfo-instances のすべてのプロパティに「組み込み」値を持ち、引数useUserOverride: false
を使用してこれらの「組み込み」値を使用するように書式設定を強制できるため、常に同じ文字列を出力します。
しかし、そうではないようです!
コード:
CultureInfo cultInfo = new CultureInfo(name: "fr-CH", useUserOverride: false) //* fr-CH" is Swiss-French
Decimal myDec = -123456789123456.987654321M;
String output = myDec.ToString(format: "N4", provider: cultInfo); // I was expecting always same output independent, which user is calling it in which computer, but this is not the case!
このサンプル コードは、コンソール アプリケーションとして .Net Core 6 でコンパイルされ、a) Windows 10 Pro PC と b) Windows Server 2012R2 で実行され、異なる出力がありました。
- Fr-CH/Windows Pro 10 PC: -123 456 789 123 456,9877
- Fr-CH/Windows Server 2012R2: -123'456'789'123'456.9877
設定しても同じCultureInfo cultInfo = CultureInfo.InvariantCulture
: 結果は常に同じに見えますが、これは予想どおりです。
上記の -variableを設定Thread.CurrentThread.CurrentCulture
しThread.CurrentThread.CurrentUICulture
て使用してから を呼び出してみましたが、効果はありませんでした。PS。私は実際にhere、here、およびhereから、設定はフォーマット (私の場合) とは関係なく、翻訳 (resx のもの) とは関係がないことを学びました。cultInfo
ToString(format?, provider?)
CurrentThread
Thread.CurrentThread.CurrentUICulture
-classに関するマイクロソフトのドキュメントCultureInfo
のこの膨大な部分を認識していますが、そこの森から木を見ることができません。
私の質問は次のとおりです。
- .Net Core (または任意のバージョンの .Net Framework) のバージョンには、すべての CultureInfo プロパティの「組み込み値」がありますか?
- 環境に関係なく、特定の文化を常に正確に使用するようにコードを強制するにはどうすればよいですか?
これは、ライブラリ出力を信頼できる方法で単体テストできるようにするために非常に重要です。
これは、System.Convert(value, provider?) を使用して、任意のコンピューターの任意のユーザーによって出力された値を読み取るときに (それらが出力されたカルチャを知っているだけで)、おそらく重要です。