Reputation: 14204
I have the following block of code:
string price = "1,234.56";
decimal value = 0;
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
if (Decimal.TryParse(price, allowedStyles, CultureInfo.InvariantCulture, out value))
{
Console.log("Thank you!");
}
else
{
throw new InvalidFormatException();
}
Ultimately, price
will either be in US style (i.e. 1,234.56) or German style (i.e. 1.234,56). My challenge is right now, Decimal.TryParse
fails. I suspect its because of the thousands separator. Which is why I added the allowedStyles
variable.
What am I doing wrong?
Upvotes: 5
Views: 5377
Reputation: 9249
If you AND-combine the NumberStyles
-flag, you will get None
.
00100000 (AllowDecimalPoint)
&
01000000 (AllowThousands)
--------
00000000 (None)
Try to OR-combine them: NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands
00100000 (AllowDecimalPoint)
|
01000000 (AllowThousands)
--------
01100000 (AllowDecimalPoint, AllowThousands)
Additionally, I'm afraid that you can't parse both styles (US style and DE style) with one statement.
So I'd try both:
string price = "1,234.56";
decimal value = 0;
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("DE-de"), out value))
{
Console.Write("Danke!");
}
else if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("EN-us"), out value))
{
Console.Write("Thank you!");
}
else
{
throw new InvalidFormatException();
}
Upvotes: 6
Reputation: 156948
The result of this binary and
(&
) will always be 0
(false
, or NumberStyles.None
). That's why it doesn't allow decimal and thousand separators:
var allowedStyles = (NumberStyles.AllowDecimalPoint & NumberStyles.AllowThousands);
Change to binary or
(|
):
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
Upvotes: 1