CultureInfo.InvariantCultureの意味?


177

私はそのようなテキストの文字列を持っています:

var foo = "FooBar";

呼び出される2番目の文字列を宣言し、barこれを最初のの最初と4番目の文字に等しくしたいfooので、次のようにします。

var bar = foo[0].ToString() + foo[3].ToString();

これは期待どおりに機能しますが、ReSharperCulture.InvariantCulture角かっこ内に置くように勧めているため、この行は次のようになります。

var bar = foo[0].ToString(CultureInfo.InvariantCulture)
        + foo[3].ToString(CultureInfo.InvariantCulture);

これはどういう意味ですか、それは私のプログラムの実行に影響しますか?


2
:このSOの質問を参照してくださいstackoverflow.com/questions/8492449/...
msigman

38
5秒の答えを探している人にとっては、CultureInfo.InvariantCultureは「気にしなくても、最初からカルチャーに関与したくありません。ここで、馬鹿げたものを使ってみましょう。」
アンドリュー

5
@Andrew MSのドキュメントをすべて書き直すことはできますか、pls?
Yatrix

3
@Yatrixええ、確かに。是非!誰が支払いますか?
アンドリュー

回答:


154

すべてのカルチャが日付と10進数/通貨の値に同じ形式を使用するわけではありません。

あなたは、入力値を変換しているとき、これはあなたのために重要でます(読み)に文字列として格納されている DateTimefloatdoubleまたはdecimal。また、前述のデータ型を文字列(書き込み)にフォーマットして表示または保存しようとする場合にも問題になります。

日付と10進数/通貨の値が前もってある特定のカルチャがわかっている場合は、その特定のCultureInfoプロパティ(つまりCultureInfo("en-GB"))を使用できます。たとえば、ユーザー入力が必要な場合。

このCultureInfo.InvariantCultureプロパティは、ユーザーのローカル設定に関係なく、ソフトウェアで解析可能な文字列をフォーマットまたは解析する場合に使用されます。

デフォルト値はデフォルトなCultureInfo.InstalledUICultureので、デフォルトのCultureInfoは実行中のOSの設定に依存します。これが、カルチャー情報が意図に合っていることを常に確認する必要がある理由です(適切なガイドラインについては、Martinの回答を参照してください)。


3
"en-US"ですが、実際にはシステムの設定によって異なる場合があります。
Tracker1 '17

44
デフォルト値はnot en-USです。それは地元の文化です。またInvariantCulture、ローカルシステムに依存しないカルチャに依存しないフォーマットが必要な場合に使用されます。たとえば、テキストベースのファイル形式で作業する場合。
CodesInChaos 2013年

23
@CodesInChaosコメントに追加するには:デフォルト値がCultureInfo( "en-US")であるという主張は単に間違っています。また、CultureInfo.InvariantCultureプロパティのステートメントは、日付と10進数/通貨の値がどのカルチャ形式であるかが事前にわからない場合に使用されます。カレント、インバリアント、または特定のカルチャーのいずれかを使用することは、意識的な決定であるはずであり、それを誤ると、(米国以外の)ユーザーを遠ざけることができます。「不明」な場合は、インバリアントカルチャを使用しないでください。事前に確認する必要があります。
Martin Liversage 2013年

3
-1他のコメントで言及されている問題が原因です。マーティンの答えは、それぞれの文化を使用するときと使用しないときを教えてくれるので、より役に立ちます。
Ed Greaves

「アメリカ英語でのみ作業している場合は、心配する必要はありません。」:不正解です。アメリカ英語でのみ作業している可能性がありますが、ソフトウェアは「en-GB」または「de -DE "サーバーの場合、違いが生じます。さらに、クライアントのカルチャーを取得でき(web.configファイルでそう言う場合)、それも" en-US "ではない可能性があります...
Stefan Steiger

151

数値、日付、および時刻が文字列にフォーマットされるか、文字列から解析される場合、カルチャを使用してその方法が決定されます。たとえば、支配的なen-US文化では、次の文字列表現があります。

  • 1,000,000.00-2桁の小数で100万
  • 2013年1月29日-この投稿の日付

私の文化(da-DK)では、値には次の文字列表現があります。

  • 1.000.000,00-2桁の小数で100万
  • 2013年1月29日-この投稿の日付

Windowsオペレーティングシステムでは、ユーザーは数値と日付/時刻の形式をカスタマイズすることもでき、オペレーティングシステムのカルチャ以外のカルチャを選択することもできます。使用される書式設定は、ユーザーの選択であり、本来あるべき姿です。

あなたが値をフォーマットするときに、インスタンスに使用して、ユーザに表示されるToStringか、String.Formatまたは使用して文字列から解析DateTime.ParseDecimal.Parseデフォルトが使用することですCultureInfo.CurrentCulture。これにより、ユーザーはフォーマットを制御できます。

ただし、多くの文字列の書式設定と解析は、実際にはアプリケーションとユーザーの間で交換される文字列ではなく、アプリケーションと一部のデータ形式(XMLまたはCSVファイルなど)の間で交換される文字列です。その場合CultureInfo.CurrentCulture、フォーマットと解析が異なるカルチャで行われると壊れる可能性があるため、使用したくないでしょう。その場合は、使用する必要がありますCultureInfo.InvariantCulture(これはen-USカルチャに基づいています)。これにより、値が問題なく往復できるようになります。

ReSharperが警告を表示する理由は、一部のアプリケーション作成者がこの区別に気付いていないため、意図しない結果につながる可能性CultureInfo.CurrentCultureen-USありますが、と同じ動作をするため、これを発見することはありませんCultureInfo.InvariantCulture。ただし、アプリケーションを別のカルチャで使用すると、あるカルチャをフォーマットに使用し、別のカルチャをアプリケーションの解析に使用する可能性があると、すぐに機能しなくなる可能性があります。

要約すると:

  • 使用CultureInfo.CurrentCultureあなたは書式設定やユーザーの文字列を解析している場合(デフォルト)。
  • CultureInfo.InvariantCultureソフトウェアで解析可能な文字列をフォーマットまたは解析する場合に使用します。
  • ユーザーがフォーマットと解析の方法を制御できないため、特定の国の文化を使用することはほとんどありません。

1
最後の点、「特定の国の文化はめったに使用しない...」に関して、通貨の書式設定は例外でしょうか?たとえばDecimal、米ドルで特定の値を含む変数がある場合、例外を作成し、en-USそれを表示するときにカルチャとして使用して、ユーロの数値のような結果が得られないことを確認しますか?試してみまし CultureInfo.InvariantCultureたが、通貨マーカー¤にこれを取得したので、それが正しい方法かどうかはわかりません。
ジェフB

1
@JeffBridgman:私のアドバイスは一般的なアドバイスにすぎず、特定のケースには適用されない場合があります。ただし、小数点(カンマまたはドット)の表示方法は、ユーザーが制御するもの(たとえばを使用CultureInfo.CurrentCulture)である必要があると思います。数値の表示に加えて通貨が必要な場合は、一貫した方法で行う必要があります。つまり、aを使用せずCultureInfo、代わりにのような3文字の通貨コードを使用する必要がありますUSD 1,234.56。そうすれば、通貨を文化にマッピングする問題に直面することはありません。
Martin Liversage 2017

26

マイクロソフトによると:

CultureInfo.InvariantCultureプロパティは、ニュートラルでも特定のカルチャでもありません。これは、文化に影響されない文化の3番目のタイプです。英語に関連付けられていますが、国や地域には関連付けられていません。

http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspxから)

したがって、InvariantCultureは「en-US」のカルチャーに似ていますが、まったく同じではありません。あなたが書く場合:

var d = DateTime.Now;
var s1 = d.ToString(CultureInfo.InvariantCulture);   // "05/21/2014 22:09:28"
var s2 = d.ToString(new CultureInfo("en-US"));       // "5/21/2014 10:09:28 PM"

その場合、s1とs2は類似した形式になりますが、InvariantCultureは先行ゼロを追加し、「en-US」はAMまたはPMを使用します。

したがって、たとえば日付をテキストファイルに保存したりデータを解析したりする場合、InvariantCultureは内部での使用に適しています。そして、指定されたCultureInfoは、データ(日付、通貨など)をエンドユーザーに提示するときに適しています。


3
確認するためにサンプルコードを実行しました。InvariantCultureは、ISO 8601のyear-goes-first形式ではなく、American MM / dd / yyyyを使用しています。それにもかかわらず、それは人間の消費のためではなく、ポータブルストレージと機械的処理を目的としています。紛らわしい
Max Barraclough

4

数字(小数点、コンマ)のようなものについては、通常、特定のカルチャで好まれます。

これを行う適切な方法は、次のように文化レベル(ドイツ語)に設定することです。

Thread.CurrentThread.CurrentCulture.NumberFormat = new CultureInfo("de").NumberFormat;

4

JetBrainsは合理的な説明を提供します、

「データ構造のテキストへのアドホック変換は、現在のカルチャに大きく依存しており、元の開発者とロケールが異なるマシンでコードを実行すると、意図しない結果になる可能性があります。あいまいさを防ぐため、ReSharperは次の警告を出します。このような問題が発生する可能性のあるコード内のインスタンス。」

しかし、私が英語のみであることがわかっているサイトで作業している場合、その提案は無視します。

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