18

これは私を夢中にさせています。ASP.NET 2.0 WebForm ページに次の文字列があります。

string s = "0.009";

十分に単純です。ここで、文化がスペイン語 ("es-ES") で、文字列を Double に変換しようとすると、次のようになります。

double d = Double.Parse(s, new CultureInfo("es-ES"));

私が期待するのは0.009です。代わりに、私は 9 を取得します。.NET はそれが 1000 区切りであると考えていることを理解しています。変換?

私が行った場合

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));

フォーマットは 0,009 になりました。誰か?

4

6 に答える 6

21

あなた与えた文化を取り入れ、正しいフォーマットを適用しています。「0.009」という文字列を提供し、それがスペイン語であると伝えました...次に、それが適切にスペイン語として解釈されたと不平を言います! スペイン語ではないことがわかっている場合は、その文字列がスペイン語であるとは言わないでください。

Parse メソッドには、解析対象の文字列のカルチャを渡す必要があります。この場合は、en-US、en-Gb、または InvariantCulture になります。

于 2009-04-06T15:26:29.247 に答える
10

ジェスの書いたものは私のために働いています。「不変の文化」を得る方法を試す必要がある人のためだけに:それはこのように見えます

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(最初のスタックオーバーフローの投稿なので、そうです、かなり限界です;)

于 2010-05-19T21:25:39.890 に答える
4

あなたはそれを後方に持っています。

と言うときはdouble d = Double.Parse(s, new CultureInfo("es-ES"));、文字列がes-ESカルチャで記述されていると仮定して、文字列をdoubleに解析するように.NETに要求しています。

スペイン文化では、「。」は千単位の区切り文字なので、「0.009」は9です。

ToString()を使用して変換すると、最後に、スペイン文化を使用して0.009を文字列に変換すると表示されるため、小数点として「、」を使用すると、「0,009」が得られます。動作は正しいです。

私の推測では、不変のカルチャではDouble.Parseを使用し、スペインのカルチャではToStringを使用するため、0.009は0,009になります。

于 2009-04-06T15:26:57.453 に答える
3

あなたはそれを間違った方法で解釈していると思います。es-ESカルチャーでは、0.009は実際には9を「。」と言う長い道のりです。は小数点記号ではないため、文字列「0.009」をes-ESカルチャで解析するように要求すると、実際にdeouble9.0を取得する必要があります。「0,009」を解析するように要求すると、0.009の2倍になるはずです。

同様に、double 0.009をフォーマットするように要求すると、es-ESで文字列「0,009」を取得する必要があります。

于 2009-04-06T15:29:39.130 に答える
2

解析とフォーマットを間違えています。.ベースのカルチャでフォーマットされた文字列を取得し、ベースのカルチャを使用して解析するため、最初は.009ではなく9を取得します。作成されたカルチャを使用して解析し、表示するカルチャを使用してフォーマットする必要があります。

于 2009-04-06T15:27:30.493 に答える
1
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

es-ESカルチャでは、「、」は10進数の区切り文字です(「。」ではありません)。

于 2009-04-06T15:32:05.427 に答える