web-dev-qa-db-ja.com

文字列を解析して数値C#をフロートします

文字列に浮動小数点数があります。 1つの問題があります。番号は「。」を使用します小数点としての「、」ではありません。

このコードは機能していません:

MyNumber = float.Parse("123.5");

文字列置換関数を使用して、解析前にこの文字列を「修復」できることを知っています。

MyNumber = float.Parse("123.5".Replace('.',',');

しかし、それを行う他の方法はありますか?

11
Hooch

スティーブンの質問に追加するために、別の議論をするのではなく、重要なことはなぜ小数点記号は_._です。

ソースがコンピューターで読み取り可能な形式であり、ピリオドの小数点記号がドキュメント仕様の一部として指定されているためである場合は、Stevenが_CultureInfo.InvariantCulture_を使用する場合とまったく同じように実行します。

特定のロケールでの人間による入力の場合は、そのロケールに適したCultureInfoでそのロケールを一致させる必要があります。そうでない場合、ソフトウェアを別のロケールで使用すると、まったく逆の問題が発生します。通常、スレッドのCurrentCultureをこれに一致するように設定します(フォーマットの場合はCurrentCulture、言語の場合はCurrentUICulture)。これを行った場合、フォームfloat.Parse(string)はそのカルチャを使用するため、カルチャを渡す必要はまったくありません。ただし、float.Parse(string, CurrentCulture)を使用することをお勧めします。これがあなたがしていることであることを明示します(そして、あなたがこのように特定していないときに文句を言ういくつかのソフトウェア分析をシャットダウンします)。

本当に注意が必要なのは、ピリオドとコンマの両方を受け入れる必要がある場合です。特に、ピリオドを小数点として使用し、コンマを千単位の区切り文字として使用する多くのカルチャでは、明確な解析を保証することは不可能です。ただし、数千の問題があなたに影響を与えないと仮定すると、あなたが質問で与えたコードがアプローチですが、反対のことをして(コンマをピリオドに置き換えて)、不変の文化で解析することをお勧めします。さらに多くの文化の変化によって引き起こされるさらなる合併症。

8
Jon Hanna

文字列置換の使用は非常に壊れやすく、問題のバグにつながります。代わりにIFormatProviderを指定してください。例えば:

MyNumber = float.Parse("123.5", CultureInfo.InvariantCulture);

または、NumberFormatInfoの別のオーバーロードを使用してParseを指定することもできます。

22
Steven

これは、現在実行されているスレッドカルチャの現在のカルチャによって異なります。

float.Parse("123,5", system.threading.thread.currentthread.currentculture); 

float.Parse("123.5", system.threading.thread.currentthread.currentculture); 

文化固有のものを厳密に望まない場合は、

float.Parse("123.5", CultureInfo.InvariantCulture);
1
dotnetstep