Search code examples
c#.netparsingglobalizationcultureinfo

Why do commas behave differently in int.Parse() and decimal.Parse() with InvariantCulture?


Why does:

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

return a decimal of 12345, yet:

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

throws an exception? I would expect the commas to be treated the same for the same culture. If decimal.Parse returns 12345, why doesn't int.Parse also return 12345?


Solution

  • See NumberStyles

    The default NumberStyles for int is Integer:

    Integer Indicates that the AllowLeadingWhite, AllowTrailingWhite, and AllowLeadingSign styles are used. This is a composite number style.

    Compare to Number (used for decimal):

    Number Indicates that the AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint, and AllowThousands styles are used. This is a composite number style.

    If you want more, use the overload that accepts NumberStyles, and supply (for example) NumberStyles.Number or NumberStyles.Any:

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