-1

情况 - 我的网络应用程序中的线程文化已设置为“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)

数字返回 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

1

你说“0.1”是西班牙语的数字。其实不是,是numberInEnglish或者别的什么

var numberInSpanish = "0.1";//this is number in english culture

它应该是

var numberInSpanish = "0,1";//<--Note 0,1

NumberDecimalSeparator对于西班牙语是,。解析0,1你会得到预期的结果。

var numberInSpanish = "0,1";
var spanishCulture = CultureInfo.CreateSpecificCulture("es");
var culture = new CultureInfo("en-US", false);
Thread.CurrentThread.CurrentCulture = spanishCulture;
Thread.CurrentThread.CurrentUICulture = spanishCulture;
double number;
double.TryParse(numberInSpanish, NumberStyles.Any, spanishCulture, out number);

这里number被正确解析为“0.1”

于 2013-09-30T11:57:44.980 回答
0

您的问题在于小数和千位分隔符的混合,即:

'。' - "es" 文化中的千位分隔符,在解析时将被忽略(例如 1.000,0 == 1000,0)

',' - "es" 文化中的小数分隔符,分隔整数和小数部分

您可以轻松说服自己:

  var spanishCulture = CultureInfo.CreateSpecificCulture("es");
  Char dS = spanishCulture.NumberFormat.NumberDecimalSeparator; // <- ','
  Char tS = spanishCulture.NumberFormat.NumberGroupSeparator;   // <- '.' 

因此,在您的情况下,字符串“0.1”将转换为 1.0 double,因为 '.' 作为 es 文化中的千位分隔符将被忽略。您可以执行以下任一操作:

  1. 使用不变文化而不是“es”之一:

    double.TryParse(numberInNeutral, NumberStyles.Any, CultureInfo.InvariantCulture, out number);

  2. 或使用实际的西班牙数字表示

    var numberInSpanish = "0,1";

    double.TryParse(numberInSpanish, NumberStyles.Any,culture, out number);

于 2013-09-30T12:18:34.973 回答
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 回答