Исключение конверсии в неправильной строке - PullRequest
0 голосов
/ 06 марта 2019

У меня есть двухмерный список укусов, и я конвертирую некоторые из них в двойные.Это отлично работает на моем ПК, но не работает, когда кто-то использует другой десятичный сапаратор по какой-то причине

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.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Является ли строка списком строк (например, List<string>)? Какая линия 454?

Класс Convert создает исключение, когда преобразование не работает. Вы можете попробовать с double.TryParse(), которые возвращают true или false. Если вам нравится Convert, попробуйте Convert.ToDouble(value, System.Globalization.CultureInfo.InvariantCulture), это должно работать в любой культуре, если вы конвертировали "," в "." первый.

0 голосов
/ 06 марта 2019

Кажется, проблема действительно в десятичном разделителе; ваш код предполагает, что используется точка, что не всегда правильно.

вы можете попытаться преобразовать строки в выбранный разделитель, каким бы он ни был, примерно так:

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;
    }
...