2011-12-11 12 views
29

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

なぜそれが起こっているのですか?

+8

おそらくあなたはどこのシステム上のwhisを実行している:誰かが、どこかで、だから私はこれを試してみましょう ...その日を考えて非常に幸運ではなかったです'.'は小数点ではなく'、 'ですか? – Yahia

+0

はい、それは場合かもしれませんが、それを解決する方法は? – Patryk

+2

@ Yahia:答えを提示してください(また、IFormatProviderを使用してカルチャを指定できるようなオーバーロードを含む)ことをお勧めします。 – Richard

答えて

46

それはおそらくあなたが.は小数点ではなく,ないシステムでこれを実行している...のアカウントに、実行時ローカリゼーションの設定を取り...

私はあなたが関係なく、あなたが小数点として .で稼働しているシステムの固定文化をしたいと仮定し、あなたの特定のケースで

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

OR

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

いくつかのMSDNの参照リンク:

-3

それは私の作品:

double temp = 0; 
Console.WriteLine(double.TryParse("0.0000", out temp)); 
Console.ReadLine(); 

Trueを書き込みます。

7

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) 
+1

コードがテキストと一致しない。 –

+0

ありがとう、固定.. – CodesInChaos

2

ほぼ確実に問題がThread.CurrentCultureは小数点としてドットを使用していないということです。

あなたは数が常に小数点としてドットでフォーマットされることがわかっている場合は、double.TryParsethe other overloadを利用して、このコードを使用します

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

を、現在の文化は小数点区切り文字を指定する場合には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アプリケーションでは、これは異なる場合があります。

1

"。"を持つものにカルチャを変更するには小数点区切りの使用など:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
+0

現在のカルチャーを変更するのはちょっと醜いです。特に保存して復元する必要があるためです。そして、あなたは例外を処理する必要があります... – CodesInChaos

+0

@CodeInChaos:私は多分、彼は同じようにダブル幅のアプリケーション全体または少なくともスレッド全体の解析を必要と考えていた。したがって、彼は彼が呼び出すすべての解析メソッドに文化を渡すことを避けることができます。 – Tudor

1

このメソッドが戻ると、変換が成功した場合、倍精度浮動小数点Sパラメータに 数当量、含有 、又は ゼロなら変換に失敗しました。

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

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

ゼロゼロが出てくる、で行きます。

0

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

-1

これについて最も愚かなことは、私のカルチャーの小数点区切り文字として "、"を受け入れるだけですが、結果は "。"です。 ...それは考慮に入れ、実行時ローカリゼーションの設定を取る

if ((double.TryParse(sVat, out vat)) == false) 
    if (double.TryParse(sVat.Replace(",", "."), out vat) == false) 
     double.TryParse(sVat.Replace(".", ","), out vat); 
+1

「これを試してみよう」これは答えですか?それは動作しますか?もし私が "これを試してみる"と言っていないなら。 –

関連する問題