Мы разрабатываем установленное программное обеспечение, которое хорошо работает на всех известных компьютерах кроме одного. Проблема состоит в том, чтобы проанализировать строки, которые начинаются "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:
Кажется, что существует проблема с подобными признаками, но никакая реальная первопричина. Если бы кто-либо мог бы уточнить это, я был бы благодарен!
Для 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, и, кстати, в следующий раз, когда вам понадобится добавить дополнительную информацию к вашему вопросу, вы должны отредактировать ее вместо того, чтобы указывать ее в ответе.