十进制数据类型在需要显示时去除尾随零

Posted

技术标签:

【中文标题】十进制数据类型在需要显示时去除尾随零【英文标题】:Decimal data type is stripping trailing zero's when they are needed to display 【发布时间】:2012-11-26 00:51:32 【问题描述】:

我正在开发的一个网络应用程序(另一个开发人员编写了它)有一个十进制变量,它在小数点后去掉两个零。如果它们包含一个大于 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);

【问题讨论】:

在不知道它正在经历的管道的情况下很难 - 你能展示一些代码上下文吗?否则,我会建议 string.Format - 但你已经尝试过了。 正如其他人在(正确)正确答案中提到的那样;您想使用“D2”字符串格式。 "N2" 填充到小数点的左边。 D2 不工作了,伙计们。 看Cole Campbell的回答,真的很有趣! 【参考方案1】:

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

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

> Demo <

Standard Numeric Format Strings

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

【讨论】:

LOL.. 10 票,然后你发现这行不通)) @SergeyS:是的,我很惊讶没有人记得它。我只是为了好玩而检查了它,并认为 Ideone 是原因(没有其他可用的 IDE)。但是,"0.00" 有效。 OP 已经尝试过一个正确的版本:String.Format("0:0.00", TotalDue);但这对他不起作用。这意味着他有另一个问题(不是格式) 科尔坎贝尔的回答真的很有趣! Decimal.ToString 的行为实际上非常不同,具体取决于 decimal 的初始化方式。 @TimSchmelter:我正在尝试同样的事情,但我有 TotalDue ? 一个可为空的十进制变量。我怎样才能做到这一点?【参考方案2】:

您的第一个示例删除零的原因可能与您创建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() 生成的字符串相同。

【讨论】:

Cole 这很有启发性,写得很好,但它仍然没有解决我的问题......但我还在玩它......只是想说谢谢你抽出宝贵的时间解释! 非常有趣。它仅适用于 .ToString() 没有任何类型格式(用于隐式转换),但这绝对不是我所期望的行为。【参考方案3】:

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

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

【讨论】:

D2 不工作。你只需要在那个答案之后尝试。 @SergeyS - 你是对的。这就是我基于对文档和内存的快速检查所得到的。将其更改为 F2。【参考方案4】:

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

String Formatting Doubles

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

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

【讨论】:

大家的cmets都很有帮助 谢谢!我可以让示例在控制台中工作,但不能在应用程序中工作。要么问题出在我还无法确定的代码中的其他地方。我展示的代码行是外部文本文件进入的第一个入口点。无论我使用什么数据类型,var、string、decimal,文本都是 261M。 如果来自访问的原始数据以 261M 的形式进入,您需要在表示层去掉 M 并对其进行格式化,或者在访问中格式化字符串。尽管我怀疑您的值末尾的 m 是出于格式化目的,但请参阅 Cole Campbells 的回答。如果可行,请确保您接受他的回答! @Doreen - 根据我的回答,在调试器中查看“261M”是完全正常的。但是,如果您正在读取的数据是一个显示“261M”的字符串,那么这是一个数据问题。你能看看原始数据,看看那里是什么样子吗? 从那以后我了解到 TotalDue 变量用于外部类(用 vb 编写),并被转换为像这样的浮点数:

以上是关于十进制数据类型在需要显示时去除尾随零的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 中的十进制中删除尾随零

截断尾随零 datagridview 列

在 SQL Server 中划分小数类型会导致不必要的尾随零

XSLT:显示尾随零

我如何确保十进制中有一定数量的数字(尾随零)

如何格式化浮点值,使其从不使用指数表示法,也没有尾随零?