web-dev-qa-db-ja.com

double.TryParse( "0.0000"、out doubleValue)がfalseを返すのはなぜですか?

文字列「0.0000」をdouble.TryParse()で解析しようとしていますが、この特定の例でなぜfalseを返すのかわかりません。整数のような文字列を渡すとき「5」は、値5に正しく解析されます。

なぜ起こっているのでしょうか?

32
Patryk

実行時のローカリゼーション設定を考慮に入れます...おそらく、.は小数点ではなく、,代わりに...

あなたの特定のケースでは、.小数点として:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

OR

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

いくつかのMSDNリファレンスリンク:

50
Yahia

TryParseはデフォルトで現在のカルチャを使用します。また、現在のカルチャが.とは異なる小数点区切り文字を使用している場合、0.0000を意図したとおりに解析できません。したがって、CultureInfo.InvariantCultureを渡す必要があります。

var numberStyle = NumberStyles.AllowLeadingWhite |
                 NumberStyles.AllowTrailingWhite |
                 NumberStyles.AllowLeadingSign |
                 NumberStyles.AllowDecimalPoint |
                 NumberStyles.AllowThousands |
                 NumberStyles.AllowExponent;//Choose what you need
double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)
9
CodesInChaos

ほぼ間違いなく、問題はThread.CurrentCultureは小数点を小数点として使用しません。

数値が常に小数点記号としてドットでフォーマットされることがわかっている場合は、 他のオーバーロード of double.TryParse

style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
    // whatever
}
3
Jon

現在のカルチャが.文字とは異なる小数点区切り文字を指定している場合、falseを返します。

文字列表現を解析するとき、文字列がどのカルチャで表現されているかを認識する必要があります。そうしないと、予期しない動作が発生します。

この場合、falseを取得しますが、さらに悪いこともあります。たとえば、次の例では、1番を取得することを期待している場合、代わりに1000を取得します。

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");

double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);

これは、pt-PTカルチャでは.文字がNumberGroupSeparatorとして使用され、,文字がNumberDecimalSeparatorとして使用されるためです。

解析する入力がユーザーからのものである場合、ユーザーが関連付けられているカルチャを使用して常に解析します。ユーザーが関連付けられているカルチャを取得することは、コンテキストに依存するものです。たとえば、UIスレッド上で取得するときにThread.CurrentThread.CurrentCultureを使用するWindowsフォームアプリケーションなどです。 ASP.NETアプリケーションでは、これは異なる場合があります。

2
João Angelo

文化を「。」を持つものに変える小数点区切りとして使用:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
1
Tudor

このメソッドが戻るとき、変換が成功した場合はsパラメーターに相当する倍精度浮動小数点数が含まれ、変換が失敗した場合はゼロが含まれます。

このメソッドのMSDNページから。

http://msdn.Microsoft.com/en-us/library/994c0zb1.​​aspx

ゼロが入り、ゼロが出ます。

1
Kill Joy

TryParseを使用してCultureInfoを変更しても、何の効果もありませんでした。コントロールパネルで数値形式(変更、日付、時刻、または数値形式)を変更し、小数点記号を変更する必要がありました。それが再び働いたよりも。

0
Cerveser