我在编写的程序中遇到了一个不寻常的怪癖,我试图找出是否有人知道原因。注意fixing这个问题很简单。我只是不明白为什么会发生这种情况。
我有一个用以下语言编写的 WinForms 程序VB.NET即显示数据的子集。它包含一些显示数值的标签(.Text
标签的属性直接从十进制值分配)。这些数字由我编写的 DLL 返回C#。 DLL 调用一个 Web 服务,该服务最初返回有问题的值。它返回一个作为字符串,另一个作为十进制(我对网络服务没有任何控制权,我只是使用它)。 DLL 将这些属性分配给对象的属性(均为小数),然后将该对象返回给调用该 DLL 的 WinForm 程序。显然,Web 服务还消耗了许多其他数据,但没有发生可以修改这些属性的其他操作。
所以,简短的版本是:
- WinForm 请求一个新的
Foo
来自 DLL。
- 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 问题提出了完全相反的问题……如何在初始解析时保持格式)。
目前,我刚刚从解析的初始字符串中删除了尾随零,这隐藏了这个怪癖。但是,我很想知道为什么会发生这种情况。
这是因为缩放因子也保留所有尾随零 http://msdn.microsoft.com/en-us/library/system.decimal.aspx以十进制数表示。尾随零不会影响算术或比较运算中十进制数的值。但是,如果应用适当的格式字符串,ToString 方法可能会显示尾随零。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)