【问题标题】:String contains trailing zeroes when converted from decimal从十进制转换时,字符串包含尾随零
【发布时间】:2014-08-18 20:55:21
【问题描述】:

我在编写的程序中遇到了一个不寻常的怪癖,我试图弄清楚是否有人知道原因。请注意,修复问题非常简单。我只是无法弄清楚为什么会发生这种情况。

我有一个用 VB.NET 编写的 WinForms 程序,它显示数据的子集。它包含一些显示数值的标签(标签的.Text 属性直接从十进制值分配)。这些数字由我用 C# 编写的 DLL 返回。 DLL 调用最初返回相关值的 web 服务。它返回一个作为字符串,另一个作为小数返回(我对 web 服务没有任何控制,我只是使用它)。 DLL 将这些分配给对象的属性(两者都是小数),然后将该对象返回给调用 DLL 的 WinForm 程序。显然,Web 服务还消耗了许多其他数据,但没有发生其他可以修改这些属性的操作。

所以,简短的版本是:

  • WinForm 从 DLL 请求一个新的Foo
  • DLL 创建对象Foo
  • DLL调用webservice,返回SomeOtherFoo

    //Both Foo.Bar1 and Foo.Bar2 are decimals
    Foo.Bar1 = decimal.Parse(SomeOtherFoo.Bar1); //SomeOtherFoo.Bar1 is a string equal to "2.9000"
    Foo.Bar2 = SomeOtherFoo.Bar2; //SomeOtherFoo.Bar2 is a decimal equal to 2.9D
    
  • DLL 将 Foo 返回给 WinForm。

    WinForm.lblMockLabelName1.Text = Foo.Bar1 //Inspecting Foo.Bar1 indicates my value is 2.9D
    WinForm.lblMockLabelName2.Text = Foo.Bar2 //Inspecting Foo.Bar2 also indicates I'm 2.9D
    

那么,有什么怪癖呢?

WinForm.lblMockLabelName1.Text 显示为 "2.9000",而 WinForm.lblMockLabelname2.Text 显示为 "2.9"

现在,我所知道的关于 C# 和 VB 的一切都表明,最初被解析为小数的字符串的格式应该与稍后在同一个小数上调用的 decimal.ToString() 操作的结果无关。我希望decimal.Parse(someDecimalString).ToString() 会返回没有任何尾随零的字符串。我在网上找到的所有东西似乎都证实了这一点(有无数 Stack Overflow 的问题正好相反……如何保持初始解析的格式)。

目前,我刚刚从被解析的初始字符串中删除了尾随零,这隐藏了这个怪癖。不过,我很想知道为什么会这样。

【问题讨论】:

  • 我会将SomeOtherFoo.Bar2 的声明修改为设置为 2.9000D,以使它们真正“等效”。我的想法是 Parse 保留小数精度,即使右 3 位数字为 0。
  • 不知道这是否能解决你的怪癖,但前段时间我遇到了一些双精度和小数解析问题,Decimal.Parse(stringNumber,CultureInfo.InvariantCulture) 为我完成了这项工作
  • 两位小数真的一样吗? Foo.Bar1==Foo.Bar2 吗?
  • @JoelEtherton 我无法控制 SomeOtherFoo。它是由我正在使用的网络服务返回给我的。不过,如前所述,我并不特别关心“修复”它——我已经这样做了。问题是是否有人知道它为什么会发生,而一切似乎都表明十进制不应该保留最初的格式。您提到了精度……但不是所有小数本质上都具有相同的精度吗?
  • 我刚刚像这样快速测试了你的代码,它产生了2.9000 var somemString = decimal.Parse("2.9000").ToString();你在那个标签上设置了一些最大长度还是什么

标签: c# asp.net vb.net winforms


【解决方案1】:

这是因为十进制数中的比例因子也是preserves any trailing zeros。尾随零不会影响算术或比较运算中的 Decimal 数的值。但是,如果应用了适当的格式字符串,ToString 方法可能会显示尾随零。

【讨论】:

  • 感谢您的参考。我会发誓消除尾随零,但情况似乎并非如此。这让我想知道我在 StackOverflow 上发现的所有问题,询问如何在转换后保留尾随零...
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2021-08-12
  • 2022-01-21
  • 2012-06-28
  • 1970-01-01
  • 2011-02-12
  • 2012-06-05
  • 1970-01-01
相关资源
最近更新 更多