-1

状況 - Web アプリのスレッド カルチャが 'es' (スペイン語) に設定されています

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("es");
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("es");

文字列値は「0.1」です。次の式の場合、

var value = "0.1"
provider = CultureInfo.CreateSpecificCulture("en-US")
double.TryParse(value.ToString(), NumberStyles.Any, provider, out number)

number は 1.0 を返します。これは、スレッドから文化情報を選択していると思わせます。私が提供するものではありません。

次の単体テストはパスします (予想どおり)。

var numberInEnUS = "0.1";
var spanishCulture = CultureInfo.CreateSpecificCulture("es");
culture = new CultureInfo("en-US", false);
Thread.CurrentThread.CurrentCulture = spanishCulture;
Thread.CurrentThread.CurrentUICulture = spanishCulture;
double number;
double.TryParse(numberInEnUs, NumberStyles.Any, culture, out number);
Assert.AreEqual(0.1, number);

では、問題は、アプリケーションで double.TryParse が失敗するのはなぜですか? 理論的には、スペイン語の 0.1 は 1 です (スペイン語のセパレーターは小数点 '.' です)。ただし、数値 1000.0 は 10000 に変換されません。したがって、0.1 のみで失敗するようです。

4

3 に答える 3

0

やっと何が悪いのか特定できました。問題は TryParse() 関数ではなく、ToString() 関数にありました。

上記のように、値は実際には文字列ではなく、Double 型でした。(私の悪い、私はそれが関係ないと思った)。私は実際に value.ToString() を行っていました。これは、スレッド カルチャを使用して値を変更する場所です。したがって、値が 0.1 の場合、value.ToString() は値を "0,1" に変更します。スレッド カルチャに基づいて小数点文字を自動的に変更します。次に、TryParse は en-US カルチャを使用して、"0,1" を 1 に変換します。

これを修正するには、代わりに Convert.ToString を使用し、カルチャ情報を渡します。

結局、それはただのばかげた間違いでした。

LessonLearnt - グローバル化されたアプリケーションで ToString() を使用する場合は注意してください!

于 2013-10-02T15:41:41.967 に答える