11

我正在开发的一个网络应用程序(另一个开发人员写了它)有一个十进制变量,它在小数点后去掉两个零。如果它们包含一个大于 0 的数字或其组合,它不会丢弃尾随的 2 位数字。该值来自文本文件。

示例文本值为: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 数据库中启动。

更新:今天(2015 年 12 月 1 日)我意识到我从未标记答案,因为我最终废弃了原始代码并在 C#.net 中重写了它。我会标记 Cole Campbell 的答案是正确的,因为他的评论(“以一种能够为它提供有关输入精度的足够数据的方式构建小数。”)是促使我想出我所做的解决方案的原因,即操纵传入的数据。我是用一种方法这样做的——只显示下面重要的部分(AmtDue)。提醒传入数据的格式为“261.00”(例如 AmtDue = 261.00):

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

4 回答 4

17

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

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

> 演示 <

标准数字格式字符串

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

于 2012-12-07T19:45:41.783 回答
16

您的第一个示例删除零的原因可能与您创建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().

于 2012-12-07T20:01:10.630 回答
4

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

在此处尝试数字格式代码。“F2”就是你想要的。

于 2012-12-07T19:46:43.397 回答
3

我相信你可以用谷歌搜索,并且可能已经看到了这个链接,但这里仅供参考:

字符串格式双打

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

但是,如果没有更多上下文,我们将不知道如何解决此问题。

于 2012-12-07T19:46:14.047 回答