十进制数据类型在需要显示时去除尾随零
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 编写),并被转换为像这样的浮点数:以上是关于十进制数据类型在需要显示时去除尾随零的主要内容,如果未能解决你的问题,请参考以下文章