Почему decimal.Parse (10 10) действителен? - PullRequest
2 голосов
/ 20 сентября 2011

Почему decimal.Parse(10 10) действителен?
Мне нужно получить исключение в таком случае.
Пожалуйста, сообщите мне что-нибудь.

decimal c;
try
{
   c = decimal.Parse("10 10");
   Console.Write(c);
   Console.ReadLine();
}
catch (Exception)
{
    throw;
}

Ответы [ 3 ]

10 голосов
/ 20 сентября 2011

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

Я предполагаю, что вы находитесь в культуре, которая использует пространство в качестве разделителя тысяч. Например, если я попытаюсь разобрать «10,10», это работает, потому что запятая является разделителем тысяч в моей культуре по умолчанию.

Чтобы предотвратить это, используйте

decimal value = decimal.Parse(text, NumberStyles.None);

... или некоторая другая подходящая комбинация NumberStyles, исключая AllowThousands.

8 голосов
/ 20 сентября 2011

Из MSDN: «Параметр s интерпретируется с использованием стиля NumberStyles.Number. Это означает, что пробелы и разделители тысяч допускаются , а символы валюты - нет. Для явного определения элементов (например, символов валюты), разделители тысяч и пробелы), которые могут присутствовать в s, использовать либо метод Decimal.Parse (String, NumberStyles), либо метод Decimal.Parse (String, NumberStyles, IFormatProvider) . "

http://msdn.microsoft.com/en-us/library/cafs243z.aspx

edit: Чтобы уточнить, вам нужно либо

  1. явно установить культуру вашего приложения на тот, который НЕ позволяетПробел в числах или
  2. явно предоставляют параметр NumberStyles, который указывает, что пробел НЕ допускается

edit 2: Ответ Джона Скита верен.Например, следующее НЕ выдает исключение, потому что пробел используется в качестве разделителей тысяч в sv-SE:

Decimal.Parse(" 10 10 ", CultureInfo.GetCultureInfo("sv-SE").NumberFormat)

Следующее, однако, выдает исключение:

Decimal.Parse(" 10 10 ", CultureInfo.GetCultureInfo("en-US").NumberFormat)
2 голосов
/ 20 сентября 2011

Я только что запустил этот код в Visual Studio 2010 / C # 4.0 и получил исключение FormatException, как и ожидалось. Какие региональные настройки настроены для вашего компьютера? Возможно ли, что у вас есть "" (пробел) в качестве разделителя тысяч или десятичного разделителя?

...