0

私は .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.CurrentCultureThread.CurrentThread.CurrentUICultureて使用してから を呼び出してみましたが、効果はありませんでした。PS。私は実際にherehere、およびhereから、設定はフォーマット (私の場合) とは関係なく、翻訳 (resx のもの) とは関係がないことを学びました。cultInfoToString(format?, provider?)CurrentThreadThread.CurrentThread.CurrentUICulture

-classに関するマイクロソフトのドキュメントCultureInfoのこの膨大な部分を認識していますが、そこの森から木を見ることができません。

私の質問は次のとおりです。

  • .Net Core (または任意のバージョンの .Net Framework) のバージョンには、すべての CultureInfo プロパティの「組み込み値」がありますか?
  • 環境に関係なく、特定の文化を常に正確に使用するようにコードを強制するにはどうすればよいですか?

これは、ライブラリ出力を信頼できる方法で単体テストできるようにするために非常に重要です。

これは、System.Convert(value, provider?) を使用して、任意のコンピューターの任意のユーザーによって出力された値を読み取るときに (それらが出力されたカルチャを知っているだけで)、おそらく重要です。

4

2 に答える 2

0

カスタム カルチャをセットアップし、必要に応じて構成できます。

のような既存の中立的なものから始めInvariantCultureます。
それをそのまま維持するためにクローンを作成しInvariantCultureます。

var clone = CultureInfo.InvariantCulture.Clone() as CultureInfo;

次に、そのクローンに必要な変更を加えます。例:

clone.NumberFormat.NumberDecimalSeparator = ",";
clone.NumberFormat.NumberGroupSeparator = ".";

オプションですが、お勧めしますが、読み取り専用バージョンを作成することをお勧めします。

var customCulture = CultureInfo.ReadOnly(clone);

固定の制御された出力が必要な場合はいつでもその文化を使用してください - 例:

var number = -123456789123456.987654321M;
var formattedNumber = number.ToString("N4", customCulture)); // -123.456.789.123.456,9877

stringフォーマットされたバージョンを解析して元に戻すときに、同じカルチャを適用しますdecimal- 例:

var parsedNumber = decimal.Parse(formattedNumber, customCulture);

CultureInfoのセットアップ方法に興味がある場合は、ソース コードを参照してください。
要するに、InvariantCultureこれは固定設定の 1 つであり、それ以外はオペレーティング システムとオプションのユーザー オーバーライドに依存しています。

ドキュメントから:

.NET は、実装、プラットフォーム、およびバージョンに応じて、さまざまなソースの 1 つからカルチャ データを取得します。

  • .NET Framework 3.5 以前のバージョンでは、カルチャ データは Windows オペレーティング システムと .NET Framework の両方によって提供されます。

  • .NET Framework 4 以降のバージョンでは、カルチャ データは Windows オペレーティング システムによって提供されます。

  • Windows で実行されている .NET Core のすべてのバージョンで、カルチャ データは Windows オペレーティング システムによって提供されます。

このため、特定の .NET 実装、プラットフォーム、またはバージョンで使用できるカルチャは、別の .NET 実装、プラットフォーム、またはバージョンでは使用できない場合があります。

一部の CultureInfo オブジェクトは、基になるプラットフォームによって異なります。

于 2021-12-22T19:31:22.220 に答える