使用InvariantCulture的C#double.TryParse返回意外结果

Wyl*_*rio 3 .net c# double culture parsing

我正在尝试使用NUnit对getprice方法进行单元测试.我坚持将rawprice解析为double.我的cultureinfo是,en-US但我把它设置de-DE为这个测试.使用numberstyles.any和invariantculture进行双重解析会返回意外结果.

rawprice cultureinfo是未知的,它可以是任何.它运行的服务器也是未知的,可以使用任何语言.

对于这个测试,我尝试使用德语作为原始价格和机器.

我试过解析"9,42"但结果却是942.

[Test]
[SetCulture("de-DE")]
public void GetPrice_PriceTextWithCommaDecimal_ReturnsInvariantPrice()
{
    var rawPriceText = "9,42";
    double.TryParse(rawPriceText, NumberStyles.Any, CultureInfo.InvariantCulture, out double price);
    //parsed price result is 942

    ...
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*iho 7

从你的问题中不清楚你的期望.但是,就代码所做的而言,它正在完成您告诉它的操作:

  • 提供NumberStyles.Any告知double.TryParse()允许任何格式,除了AllowHexSpecifier.这包括AllowThousands选项.
  • 提供InvariantCulture解析的原因以将','字符用作千位分隔符.
  • 解析并不真正关心那里千位分隔符出现.即它实际上并不强制分隔符位于指示数千位数的位置.

因此,当你要求它解析时"9,42",该文本被解释使用InvariantCulture(即忽略你当前的文化de-DE),该','字符被视为千位分隔符(即为了计算实际值而被忽略),你得到的值942,就像你要求的那样.

如果您不想要该结果,则需要使用不同的参数进行调用double.TryParse().您需要解释你什么,如果你想对你有怎样的建议论据想应该使用.我们可以说,鉴于你问题中目前的信息是你显然想要的论点.


tym*_*tam 5

中的文化ToStringTryParse必须匹配。

要么

        var s = rawPrice.ToString(CultureInfo.InvariantCulture);
        //rawPrice becomes 9.42
        double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out double price);
Run Code Online (Sandbox Code Playgroud)

或者

        CultureInfo.CurrentCulture = new CultureInfo("de-DE");
        var s= rawPrice.ToString(CultureInfo.CurrentCulture);
        //rawPrice becomes 9,42
        double.TryParse(s, NumberStyles.Any, CultureInfo.CurrentCulture, out double price);
Run Code Online (Sandbox Code Playgroud)