尝试执行货币计算时输入字符串无效

时间:2017-10-26 19:38:02

标签: c# selenium

您好我在下面的代码中收到了一个无效的输入字符串,我不确定如何解决它。我只是想做的是计算基本价格和总折扣。两者的输出都是£...

例如: 基本价格£148.00 折扣20英镑

如何使用double.parse和Numberstyles修复下面的代码:

    public double CalculateBasePriceAndTotalDiscountFromBasket(string basketLocation)
    {
        var basketSummaryContent = _driver.FindElements(CommonPageElements.BasketSummaryContent);
        var totalDiscountValue = _driver.FindElements(CommonPageElements.TotalDiscountValue);

        if (basketLocation.ToLower() == "top")
        {
            string basketSummaryContentText =
                basketSummaryContent[0].FindElement(CommonPageElements.BasePriceValue).Text;

            double basketSummaryPrice = double.Parse(basketSummaryContentText, NumberStyles.AllowCurrencySymbol);
            double totalDiscount = double.Parse(totalDiscountValue[0].Text, NumberStyles.AllowCurrencySymbol);

            return basketSummaryPrice - totalDiscount;
        }
        else
        {

            string basketSummaryContentText =
                basketSummaryContent[1].FindElement(CommonPageElements.BasePriceValue).Text;

            double basketSummaryPrice = double.Parse(basketSummaryContentText, NumberStyles.AllowCurrencySymbol);
            double totalDiscount = double.Parse(totalDiscountValue[1].Text, NumberStyles.AllowCurrencySymbol);

            return basketSummaryPrice - totalDiscount;
        }
    }

2 个答案:

答案 0 :(得分:2)

嗯,错误只能通过对于英镑货币符号无效的CultureInfo来解释。您可以使用

强制解析正确的文化
CultureInfo ci = new CultureInfo("en-GB");
double basketSummaryPrice = double.Parse(basketSummaryContentText, 
                            NumberStyles.Currency, ci);
double totalDiscount = double.Parse(totalDiscountValue[0].Text, 
                            NumberStyles.Currency, ci);

正如在另一个答案中已经说过的,我还建议在处理货币值时使用decimal数据类型。它将在这些值的数学运算中给出精确的结果。另请注意,在您的上下文中(您可能在这些数字上有小数)最好使用NumberStyles.Currency来计算小数分隔符号的存在。

答案 1 :(得分:0)

尝试使用此代替double.Parse(value, NumberStyles.Currency);

intervalObj = setInterval(yourCallbackFuction, INTERVAL_TIME);

我还建议使用十进制而不是双精度,因为像0.01这样的东西实际上不能准确地存储为双精度数。