我在写作的一个程序中遇到了一个不寻常的怪癖,我试图找出是否有人知道原因。请注意,修复问题很容易。我只是无法弄清楚为什么它首先发生。
我有一个用 VB.NET 编写的WinForms程序,它显示了一个数据子集。它包含一些显示数值的标签(标签的.Text
属性直接从Decimal值分配)。这些数字是由我在 C#中编写的DLL返回的。 DLL调用Web服务,该服务最初返回有问题的值。它返回一个字符串,另一个返回十进制(我没有对webservice的任何控制,我只是消耗它)。 DLL将这些属性分配给对象上的属性(两者都是小数),然后将该对象返回到调用DLL的WinForm程序。显然,Web服务中消耗了大量其他数据,但没有其他操作可以修改这些属性。
所以,简短的版本是:
Foo
。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问题正好相反......如何保持格式化与初始解析)。
目前,我刚刚从解析的初始字符串中删除了尾随的零,这隐藏了怪癖。但是,我很想知道为什么会发生这种情况。
答案 0 :(得分:4)
这是因为缩放因子也是preserves any trailing zeros的十进制数。尾随零不会影响算术或比较运算中的十进制数的值。但是,如果应用了适当的格式字符串,ToString方法可能会显示尾随零。