A web app I'm working on (another dev wrote it) has a decimal variable that is dropping two zero's after the decimal. It does not drop the trailing 2 digits if they contain a number > 0 or a combination of. The value is coming from a text file.
Example text value is: 261.00
Example decimal variable (TotalDue) is: 261
During debug when I hover over the "TotalDue" (in sample code below) the value displays as 261 and when I expand the debugger it reads "261M":
decimal TotalDue = Convert.ToDecimal(InputRow.Substring(260, 12));
I have tried bringing it in as a string (but initially it still reads as "261" instead of 261.00) and then converting it in various ways as follows. Nothing is working!
string TotalDue = InputRow.Substring(260, 12);
strTotalDue = String.Format("{0:F2}", TotalDue);
strTotalDue = String.Format("{0:N2}", TotalDue);
strTotalDue = String.Format(TotalDue, "0.00");
strTotalDue = TotalDue.ToString("G29");
strTotalDue = String.Format("{0:0.00}", TotalDue);
strTotalDue = TotalDue.ToString("N2");//used this one with decimal data type
What am I missing? Does it matter where the text file data originated? It started in an Access database.
UPDATE: Today (12/1/15) I realized I never marked an answer because I ended up scrapping the original code and rewriting it in C#.net. I will mark Cole Campbell's answer correct because his remarks ("construct the Decimal in a way that provides it with sufficient data regarding the precision of the input.") are what prompted me to come up with the solution I did which was to manipulate the incoming data. I did so in a method – only showing the part that matters (AmtDue) below. Reminder the incoming data was in the format of "261.00" (e.g. AmtDue = 261.00):
string AmtDue = Convert.ToString(AmountDue).Replace(".", "");
string finalstring = ("0000000000" + AmtDue).Substring(AmtDue.Length);
Best Answer
The reason your first example is dropping the zeroes likely has to do with how you're creating the
Decimal
instance.Decimal
contains a scaling factor which influences howToString()
works, and this scaling factor is set differently based on how theDecimal
is constructed.This code:
Produces these results:
If you want to preserve the trailing zeroes, construct the
Decimal
in a way that provides it with sufficient data regarding the precision of the input.Remember that, as noted by other answers, the string provided by the debugger is not necessarily the same as the string produced by
ToString()
.