международный Синтаксический анализ “8” сбои. международный Синтаксический анализ всегда требует CultureInfo. InvariantCulture?

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

Parsing:
int.Parse("8") -> Exception message: Input string was not in a correct format. 
int.Parse("80") -> 0
int.Parse("88") -> 8
int.Parse("8100") -> 100

CurrentCulture: sv-SE 
CurrentUICulture: en-US

Проблема решена с помощью международного Синтаксического анализа ("8", CultureInfo. InvariantCulture). Однако было бы хорошо знать источник проблемы.

Вопрос: Почему мы получаем это поведение "8", если мы не указываем инвариантную культуру?


Дополнительная информация:

Я действительно отправлял, небольшая программа моему клиенту достигают результата выше:

    private int ParseInt(string s)
    {
        int parsedInt = -1000;
        try
        {
            parsedInt = int.Parse(s);

            textBoxMessage.Text = "Success: " + parsedInt;

        }
        catch (Exception ex)
        {
            textBoxMessage.Text =
                string.Format("Error parsing string: '{0}'", s) + Environment.NewLine +
                "Exception message: " + ex.Message;
        }

        textBoxMessage.Text += Environment.NewLine + Environment.NewLine +
            "CurrentCulture: " + Thread.CurrentThread.CurrentCulture.Name + "\r\n" +
            "CurrentUICulture: " + Thread.CurrentThread.CurrentUICulture.Name + "\r\n";
        return parsedInt;
    }

Обновление

Я споткнулся через эту ссылку, ошибку в базе данных подключения Microsoft:

https://connect.microsoft.com/VisualStudio/feedback/details/253265/int32-parse-fails-to-convert-the-string-0-zero-on-some-systems

Кажется, что существует проблема с подобными признаками, но никакая реальная первопричина. Если бы кто-либо мог бы уточнить это, я был бы благодарен!

11
задан Henrik Carlsson 27 April 2010 в 12:58
поделиться

1 ответ

Для sv-SE культура 8 представляет CurrencyNegativePattern , поэтому вы получаете описанную вами ошибку.

Вы можете проверить это, запустив следующий пример:

var ci = new CultureInfo("sv-SE");

var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

Console.WriteLine(nfi.CurrencyNegativePattern);
Console.WriteLine(nfi.CurrencyPositivePattern);

Будет выведено:

// 8
// 3

Вы можете явно указать, что вы анализируете целое число, а не валюту, используя перегрузку Parse , которая принимает перечисление NumberStyles .

Int32.Parse("8", NumberStyles.Integer, new CultureInfo("sv-SE"));

На этот раз, поскольку вы указываете, что анализируете целое число, ошибок не произойдет.


Однако IIRC Int32.Parse по умолчанию должен интерпретировать ввод как целое число, поэтому я не понимаю, почему вы получаете ошибку с этим образцом кода.


Обновление:

Судя по недавно добавленной информации, следует убедиться, что проблема не является внешней. То есть, если пользователь, например, изменил настройку знака «плюс» в локали Windows на 8 , это будет нормально и имеет смысл получить ошибку, которую вы получаете. Это все равно, что установить + в качестве положительного знака и затем попытаться его проанализировать:

var ci = new CultureInfo("sv-SE");
var nfi = (NumberFormatInfo)ci.GetFormat(typeof(NumberFormatInfo));

nfi.PositiveSign = "+";

Int32.Parse("+", nfi); // This will throw

Спросите пользователя о его настройках реестра локали, как указано в проблеме с подключением, и убедитесь, что они такие, какие вы хотели бы ожидать.

Боковое примечание: добро пожаловать в SO, и, кстати, в следующий раз, когда вам понадобится добавить дополнительную информацию к вашему вопросу, вы должны отредактировать ее вместо того, чтобы указывать ее в ответе.

21
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: