【问题标题】:Conversion exception on wrong line错误行上的转换异常
【发布时间】:2019-03-06 13:29:30
【问题描述】:

我有一个 2D 刺痛列表,我正在将其中的一些转换为双打。这在我的电脑上完美运行,但当有人出于某种原因使用不同的十进制分隔符时失败

try
        {
            foreach (var line in data)
            {
                if (line[25] != "")
                {
                    double market_size = Convert.ToDouble(line[25].Replace(",", "."));

                    if (line[59] != "") Players.Add(new string[] { line[1], line[0], Proper_Name(line[58]), (Convert.ToDouble(line[59].Replace(",", ".")) * market_size).ToString(), market_size.ToString() });
                    else Players.Add(new string[] { line[1], line[0], "No player", "0", market_size.ToString() });
                    if (line[61] != "") Players.Add(new string[] { line[1], line[0], Proper_Name(line[60]), (Convert.ToDouble(line[61].Replace(",", ".")) * market_size).ToString(), market_size.ToString() });
                    else Players.Add(new string[] { line[1], line[0], "No player", "0", market_size.ToString() });
                    if (line[63] != "") Players.Add(new string[] { line[1], line[0], Proper_Name(line[62]), (Convert.ToDouble(line[63].Replace(",", ".")) * market_size).ToString(), market_size.ToString() });
                    else Players.Add(new string[] { line[1], line[0], "No player", "0", market_size.ToString() });
                    if (line[65] != "") Players.Add(new string[] { line[1], line[0], Proper_Name(line[64]), (Convert.ToDouble(line[65].Replace(",", ".")) * market_size).ToString(), market_size.ToString() });
                    else Players.Add(new string[] { line[1], line[0], "No player", "0", market_size.ToString() });
                    if (line[67] != "") Players.Add(new string[] { line[1], line[0], Proper_Name(line[66]), (Convert.ToDouble(line[67].Replace(",", ".")) * market_size).ToString(), market_size.ToString() });
                    else Players.Add(new string[] { line[1], line[0], "No player", "0", market_size.ToString() });
                }
            }
        }
        catch (Exception except)
        {
            MessageBox.Show("Conversion error:" + Environment.NewLine + Environment.NewLine + except.ToString());
            this.Close();
        }

首先,我认为即使使用逗号而不是点,这也应该有效,但这不是我的主要问题。也就是说,当我收到异常错误时,它会显示第 454 行,这是 foreach 循环开始的地方。 我无法显示错误消息,因为它是捷克语,但它基本上指出这是第 454 行的转换错误。

【问题讨论】:

标签: c# type-conversion except


【解决方案1】:

问题确实似乎与小数分隔符有关;您的代码假设使用了一个点,这并不总是正确的。

您可以尝试将字符串转换为选定的分隔符,无论它是什么,如下所示:

internal static string ReplaceWithDecimalSep(string input)
    {
        string firstReplace = input.Replace('.', (char)swUserPreferenceStringValue_e.swSeparatorCharacterForDims);
        string secondReplace = firstReplace.Replace(',', (char)swUserPreferenceStringValue_e.swSeparatorCharacterForDims);

        return secondReplace;
    }

然后可以通过类似于以下的方式安全地转换为双精度:

internal static double ToLocalCultureDouble(string input)
    {
        string toConvert = ReplaceWithDecimalSep(input);

        double.TryParse(toConvert, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out double result);

        return result;
    }

【讨论】:

    【解决方案2】:

    line 是一个字符串列表(例如List<string>)吗? 454是哪一行?

    只要转换不起作用,Convert 类就会抛出异常。你可以试试double.TryParse(),它返回真或假。如果您喜欢转换,那么请尝试Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture),如果您已将“,”转换为“。”,那么它应该适用于任何文化。首先。

    【讨论】:

    • 是的,行是一个列表。第 454 行是 foreach 循环开始的行。
    • 那么我猜第 454 行是double market_size = Convert.ToDouble(line[25].Replace(",", "."));。第 [25] 行包含什么?有没有不能转换的字符? “+”或“-”并不总是正确转换。将值打印到控制台或调试器并进行调查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2021-09-19
    • 2013-03-14
    • 2016-10-07
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多