Почему запятые ведут себя по-разному в int.Parsse() и decimal.Parse() с InvariantCulture?

Почему:

decimal.Parse("1,2,3,45", CultureInfo.InvariantCulture)

возвращает десятичное число из 12345, но:

int.Parse("1,2,3,45", CultureInfo.InvariantCulture)

выдает исключение? Я бы ожидал, что с одной и той же культурой будут обрабатываться то же самое. Если decimal.Parse возвращает 12345, почему не int.Parse также возвращает 12345?

Ответ 1

См. NumberStyles

По умолчанию NumberStyles для int Integer:

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

Сравните с Number (используется для decimal):

Число Указывает, что используются стили AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint и AllowThousands. Это стиль составного номера.

Если вы хотите больше, используйте перегрузку, которая принимает NumberStyles, и поставьте (например) NumberStyles.Number или NumberStyles.Any:

int i = int.Parse("1,2,3,45", NumberStyles.Number, CultureInfo.InvariantCulture);