Al Lelopath
Al Lelopath

Reputation: 6778

String to Decimal with 2 decimal places always

I have a string that is to be converted to decimal. The string could be entered with no decimal places e.g. "123" or 2 decimal places, e.g. "123.45" or somewhat awkwardly, 1 decimal place "123.3". I want the number displayed (the Property invoice.Amount which is type decimal) with 2 decimal places. The code below does that. I think it could be written better though. How?

decimal newDecimal;
bool isDecimal = Decimal.TryParse(InvoiceDialog.InvoiceAmount, out newDecimal);
string twoDecimalPlaces = newDecimal.ToString("########.00");
invoice.Amount = Convert.ToDecimal(twoDecimalPlaces);

In part, I don't understand, for the string formatting "########.00", what # does and what 0 does. E.g. how would it be different if it were "########.##"?

Upvotes: 0

Views: 5496

Answers (4)

user1672994
user1672994

Reputation: 10839

You don't need to convert the decimal to string to do the formatting for 2 decimal places. You can use the decimal.Round method directly. You can read about it here.

So your code can be converted to

    decimal newDecimal;
    Decimal.TryParse(s, out newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

The above code also be simplified with C# 7.0 declaration expression as

    Decimal.TryParse(s, out decimal newDecimal);

    newDecimal = decimal.Round(newDecimal, 2, MidpointRounding.AwayFromZero);

Now newDecimal will have have a value with 2 precision.

You can check this live fiddle.

Upvotes: 2

kjr1995
kjr1995

Reputation: 420

The "#" is optional while the "0" will show either the number or 0.

For example,

var x = 5.67;
x.ToString("##.###"); // 5.67
x.ToString("00.000"); // 05.670
x.ToString("##.##0"); // 5.670

If you just care about how many decimal places you have, I would recommend using

x.ToString("f2"); // 5.67

to get 2 decimal spots.

More information can be found at http://www.independent-software.com/net-string-formatting-in-csharp-cheat-sheet.html/.

Upvotes: 1

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186668

# is an optional digit when 0 is a mandatory digit

For instance

 decimal d = 12.3M;

 // d with exactly 2 digits after decimal point
 Console.WriteLine(d.ToString("########.00"));
 // d with at most 2 digits after decimal point 
 Console.WriteLine(d.ToString("########.##"));

Outcome:

12.30   // exactly 2 digits after decimal point: fractional part padded by 0
12.3    // at most 2 digits after decimal point: one digit - 3 - is enough

Upvotes: 2

Adrian
Adrian

Reputation: 8597

Basically, # means optional, where as 0 is mandatory. As for better explanation, if you put # then if number is available to fullfil the placeholder it'll be added if not it'll be ignored.

Putting 0 however is different as it'll always put a value in for you.

You can combine the two together.

String.Format("{0:0.##}", 222.222222); // 222.22

String.Format("{0:0.##}", 222.2); // 222.2

String.Format("{0:0.0#}", 222.2) // 222.2

Upvotes: 1

Related Questions