文字列「0.0000」をdouble.TryParse()
で解析しようとしていますが、この特定の例でなぜfalseを返すのかわかりません。整数のような文字列を渡すとき「5」は、値5に正しく解析されます。
なぜ起こっているのでしょうか?
実行時のローカリゼーション設定を考慮に入れます...おそらく、.
は小数点ではなく、,
代わりに...
あなたの特定のケースでは、.
小数点として:
double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)
OR
double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)
いくつかのMSDNリファレンスリンク:
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)
ほぼ間違いなく、問題は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
}
現在のカルチャが.
文字とは異なる小数点区切り文字を指定している場合、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アプリケーションでは、これは異なる場合があります。
文化を「。」を持つものに変える小数点区切りとして使用:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
このメソッドが戻るとき、変換が成功した場合はsパラメーターに相当する倍精度浮動小数点数が含まれ、変換が失敗した場合はゼロが含まれます。
このメソッドのMSDNページから。
http://msdn.Microsoft.com/en-us/library/994c0zb1.aspx
ゼロが入り、ゼロが出ます。
TryParseを使用してCultureInfoを変更しても、何の効果もありませんでした。コントロールパネルで数値形式(変更、日付、時刻、または数値形式)を変更し、小数点記号を変更する必要がありました。それが再び働いたよりも。