从十进制转换时,字符串包含尾随零

时间:2014-08-18 20:55:22

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

我在写作的一个程序中遇到了一个不寻常的怪癖,我试图找出是否有人知道原因。请注意,修复问题很容易。我只是无法弄清楚为什么它首先发生。

我有一个用 VB.NET 编写的WinForms程序,它显示了一个数据子集。它包含一些显示数值的标签(标签的.Text属性直接从Decimal值分配)。这些数字是由我在 C#中编写的DLL返回的。 DLL调用Web服务,该服务最初返回有问题的值。它返回一个字符串,另一个返回十进制(我没有对webservice的任何控制,我只是消耗它)。 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问题正好相反......如何保持格式化与初始解析)。

目前,我刚刚从解析的初始字符串中删除了尾随的零,这隐藏了怪癖。但是,我很想知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:4)

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