8

私は非常に奇妙なことに出くわし、何かが足りないのではないかと思っていました。

文字列 (1000 個の区切り文字を含む) を double に解析しようとしていたところ、以下の問題が見つかりました。

CultureInfo ci = CultureInfo.CurrentCulture; // en-ZA
string numberGroupSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator; //numberGroupSeparator = ,
string numberDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;//numberDecimalSeparator = .
string strValue = "242,445.24";
double try1;
double try2;
bool btry1 = Double.TryParse(strValue, out try1); //try1 = 242445.24 : btry1 = true
bool btry2 = Double.TryParse(strValue, NumberStyles.Any, null, out try2); //try2 = 0.0 : btry2 = false <- STRANGE
double try3 = Convert.ToDouble(strValue); //try3 = 242445.24

今、私が使いたくない理由は、Convert.ToDouble以前に私にいくつかの問題を与えた科学的表記法によるものです.

これがなぜなのか誰か知っていますか?

編集:

現在の文化情報を更新しました。

4

3 に答える 3

4

期待通りに私のマシンで動作しているので、現在の文化に関係していると思います。CultureInfo.InvariantCultureの代わりに使用してみてnullくださいTryParse

Double.TryParse(strValue, NumberStyles.Any,CultureInfo.InvariantCulture, out try2);

現在指定されているカルチャen-ZAでは失敗します。次のコードを試し、try20.0を保持しています。

 Double.TryParse(strValue, NumberStyles.Any,new CultureInfo("en-ZA"), out try2); 
于 2012-09-06T12:42:02.243 に答える
4

多くの掘り下げた後、更新された(正しい)答え

あなたの現在の文化en-ZA

new System.Globalization.CultureInfo("en-ZA").NumberFormat.NumberGroupSeparator

値が空の文字列であり","、質問が述べているものではないことがわかります。したがって、 に設定CultureInfo.CurrentCultureするとnew CultureInfo("en-ZA")、 の解析でも失敗しますtry1

で手動で設定した","

Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = ",";

への解析try1が成功したことが発覚します。への解析はtry2まだ失敗します。

TryParseドキュメントで使用されているオーバーロードについてはtry2、フォーマット プロバイダーが の場合に現在のスレッド カルチャが使用されていることは明らかであるnullため、何か他のことが起こっている必要があります...

en-ZA 文化と注意深く比較InvariantCulture.NumberFormatした結果、文化によって通貨の形式も異なることに気付きました。しようとしている

Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = ".";

大当たり: 解析が成功しました! 実際に何が起こっているかというと、 を使用するNumberStyles.Allと、パースは数値を currency として扱います。

試してみれば仮説は検証できる

double.TryParse(strValue,
                NumberStyles.Any & ~NumberStyles.AllowCurrencySymbol, null, out try2);

これは、通貨の区切り記号をいじる必要なく成功します (もちろん、NumberGroupSeparator適切である必要があります)!

于 2012-09-06T13:03:37.790 に答える
1

ドキュメントによると、 会話が失敗すると 0.0 が返されます。

ほとんどの場合、TryParse は false を返します。Parse を呼び出して、何が問題なのかを示す例外メッセージを取得する必要があります。

于 2012-09-06T12:38:51.060 に答える