当需要显示时,十进制数据类型正在剥离尾随零

时间:2012-12-07 19:41:15

标签: c# string types decimal

我正在研究的一个网络应用程序(另一个开发者编写)有一个十进制变量,它在小数点后丢失两个零。如果它们包含数字>它不会丢弃2位数字。 0或组合。该值来自文本文件。

示例文本值为:261.00

十进制变量(TotalDue)示例为:261

在我将鼠标悬停在“TotalDue”上时(在下面的示例代码中),值显示为261,当我展开调试器时,它显示为“261M”:

decimal TotalDue = Convert.ToDecimal(InputRow.Substring(260, 12));

我尝试将其作为字符串引入(但最初它仍然显示为“261”而不是261.00),然后按照以下各种方式对其进行转换。什么都没有用!

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

我错过了什么?文本文件数据源自何处?它始于Access数据库。

更新:今天(12/1/15)我意识到我从未标记过答案,因为我最终废弃原始代码并在C#.net中重写它。我将Cole Campbell的答案标记为正确,因为他的评论(“以一种为其提供关于输入精度的足够数据的方式构造十进制。”是促使我提出解决方案的原因我做的是操纵传入的数据。我在一个方法中这样做 - 只显示下面重要的部分(AmtDue)。提醒传入的数据格式为“261.00”(例如AmtDue = 261.00):

string AmtDue = Convert.ToString(AmountDue).Replace(".", "");           
string finalstring =  ("0000000000" + AmtDue).Substring(AmtDue.Length);

4 个答案:

答案 0 :(得分:13)

如果您想要两位小数,可以使用正确的ToString

string formatted = TotalDue.ToString("0.00");

> Demo <

Standard Numeric Format Strings

(顺便说一下,ToString("D2")不起作用)

答案 1 :(得分:10)

您的第一个示例是丢弃零的原因可能与您创建Decimal实例的方式有关。 Decimal包含影响ToString()工作方式的缩放系数,根据Decimal的构建方式设置此缩放系数。

此代码:

var d1 = Decimal.Parse("261.00");
var d2 = new Decimal(261.00);
var d3 = 261.00m;
Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);

产生以下结果:

261.00
261
261.00

如果要保留尾随零,请构造Decimal,以便为其提供有关输入精度的足够数据。

请记住,正如其他答案所述,调试器提供的字符串不一定与ToString()生成的字符串相同。

答案 2 :(得分:3)

我相信你可以google,并且可能会遇到这个链接,但这里仅供参考:

String Formatting Doubles

好像你已经尝试了strTotalDue = String.Format("{0:0.00}", TotalDue);,所以我不确定还有什么问题。

如果没有更多背景,我们将不知道如何解决这个问题。

答案 3 :(得分:2)

您在调试器中看到的数字与它实际以任何方式显示的方式无关。 261M是正确的 - 它的值为“261”,以十进制(“M”=“Money”=十进制)格式存储。

尝试使用数字格式代码here。 “F2”就是你想要的。