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)
    从你的问题中不清楚你的期望.但是,就代码所做的而言,它正在完成您告诉它的操作:
NumberStyles.Any告知double.TryParse()允许任何格式,除了AllowHexSpecifier.这包括AllowThousands选项.InvariantCulture解析的原因以将','字符用作千位分隔符.因此,当你要求它解析时"9,42",该文本被解释使用InvariantCulture(即忽略你当前的文化de-DE),该','字符被视为千位分隔符(即为了计算实际值而被忽略),你得到的值942,就像你要求的那样.
如果您不想要该结果,则需要使用不同的参数进行调用double.TryParse().您需要解释你什么你,如果你想对你有怎样的建议论据想应该使用.我们可以说,鉴于你问题中目前的信息是你显然不想要的论点.
中的文化ToString和TryParse必须匹配。
要么
        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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5323 次  |  
        
|   最近记录:  |