文字列 "0.0000"をdouble.TryParse()
と解析しようとしていますが、この特定の例でfalseが返される理由はわかりません。例えば整数のような文字列を渡す。 "5"は5の値に正しく解析されます。double.TryParse( "0.0000"、out doubleValue)がfalseを返すのはなぜですか?
なぜそれが起こっているのですか?
文字列 "0.0000"をdouble.TryParse()
と解析しようとしていますが、この特定の例でfalseが返される理由はわかりません。例えば整数のような文字列を渡す。 "5"は5の値に正しく解析されます。double.TryParse( "0.0000"、out doubleValue)がfalseを返すのはなぜですか?
なぜそれが起こっているのですか?
それはおそらくあなたが.
は小数点ではなく,
ないシステムでこれを実行している...のアカウントに、実行時ローカリゼーションの設定を取り...
.
で稼働しているシステムの固定文化をしたいと仮定し、あなたの特定のケースで
:
double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)
OR
double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)
いくつかのMSDNの参照リンク:
それは私の作品:
double temp = 0;
Console.WriteLine(double.TryParse("0.0000", out temp));
Console.ReadLine();
はTrue
を書き込みます。
TryParse
はデフォルトで現在のカルチャを使用します。現在のカルチャで.
と異なる10進数の区切り文字を使用している場合は、意図したとおりに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)
コードがテキストと一致しない。 –
ありがとう、固定.. – CodesInChaos
ほぼ確実に問題がThread.CurrentCulture
は小数点としてドットを使用していないということです。
あなたは数が常に小数点としてドットでフォーマットされることがわかっている場合は、double.TryParse
のthe other overloadを利用して、このコードを使用します
style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
// whatever
}
を、現在の文化は小数点区切り文字を指定する場合にはfalse
を返します。これは.
文字とは異なります。
文字列表現を解析するときには、表現されている文化を意識する必要があります。そうでないと予期しない動作が発生します。あなたがfalse
を取得している。この場合
、しかし、あなたがあなたの代わりに千になるだろうナンバーワンを取得するために期待していた場合はそれも次の例では例えば、悪化することができます
Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");
double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);
このpt-PT
培養物では、.
文字をNumberGroupSeparator
とし、,
文字をNumberDecimalSeparator
としているからである。
解析している入力がユーザーからのものである場合、ユーザーが関連付けられているカルチャを使用して解析します。ユーザーが関連付けられているカルチャを取得するには、コンテキストに依存するものがあります。たとえば、Windowsフォームアプリケーションの場合、取得するUIスレッドではThread.CurrentThread.CurrentCulture
を使用します。 ASP.NETアプリケーションでは、これは異なる場合があります。
"。"を持つものにカルチャを変更するには小数点区切りの使用など:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
現在のカルチャーを変更するのはちょっと醜いです。特に保存して復元する必要があるためです。そして、あなたは例外を処理する必要があります... – CodesInChaos
@CodeInChaos:私は多分、彼は同じようにダブル幅のアプリケーション全体または少なくともスレッド全体の解析を必要と考えていた。したがって、彼は彼が呼び出すすべての解析メソッドに文化を渡すことを避けることができます。 – Tudor
このメソッドが戻ると、変換が成功した場合、倍精度浮動小数点Sパラメータに 数当量、含有 、又は ゼロなら変換に失敗しました。
このメソッドのMSDNページから。
http://msdn.microsoft.com/en-us/library/994c0zb1.aspx
ゼロゼロが出てくる、で行きます。
TryParseでCultureInfoを変更すると、何もできませんでした。私は、コントロールパネル(変更、日付、時刻、または数値書式)の下で数値書式を変更し、小数点記号を変更する必要がありました。それは再び働いたよりも。
これについて最も愚かなことは、私のカルチャーの小数点区切り文字として "、"を受け入れるだけですが、結果は "。"です。 ...それは考慮に入れ、実行時ローカリゼーションの設定を取る
if ((double.TryParse(sVat, out vat)) == false)
if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
double.TryParse(sVat.Replace(".", ","), out vat);
「これを試してみよう」これは答えですか?それは動作しますか?もし私が "これを試してみる"と言っていないなら。 –
おそらくあなたはどこのシステム上のwhisを実行している:誰かが、どこかで、だから私はこれを試してみましょう ...その日を考えて非常に幸運ではなかったです'.'は小数点ではなく'、 'ですか? – Yahia
はい、それは場合かもしれませんが、それを解決する方法は? – Patryk
@ Yahia:答えを提示してください(また、IFormatProviderを使用してカルチャを指定できるようなオーバーロードを含む)ことをお勧めします。 – Richard