状況 - 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 のみで失敗するようです。