简体   繁体   中英

Parsing decimal with thousands separator

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 (ie 1,234.56) or German style (ie 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?

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 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();
}

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM