C#将十进制0转换为字符串将添加1000个分隔符和大量0';s
我有一个问题,十进制0在转换为字符串时,会添加一个千位分隔符(根据其他值的转换方式判断丹麦格式)和许多尾随的0。 从我目前掌握的数据来看,这似乎与数据来自MSSQL这一事实有关,但这只是我的猜测 我现在做的是:C#将十进制0转换为字符串将添加1000个分隔符和大量0';s,c#,excel,entity-framework,openxml-sdk,C#,Excel,Entity Framework,Openxml Sdk,我有一个问题,十进制0在转换为字符串时,会添加一个千位分隔符(根据其他值的转换方式判断丹麦格式)和许多尾随的0。 从我目前掌握的数据来看,这似乎与数据来自MSSQL这一事实有关,但这只是我的猜测 我现在做的是: 数据存储在MSSQL数据库中 我使用EntityFramework 6.0将这些数据加载到我的C#应用程序中 然后将数据转换为数据表-列上的数据类型与POCO实体上相应属性的数据类型匹配 然后使用OpenXml将DataTable中的数据写入Excel工作表 在应用程序中显示数据没有问题
string.Format(CultureInfo.InvariantCulture, "{0}", obj);
像0.1这样的值以0,1(丹麦格式)的形式保存到Excel中,并按预期在单元格中显示为0100,但所有0值都以0.00000000的形式存储和显示
在上面的代码中设置断点表示obj为0,如果我将其转换为十进制,则为0,但一旦我将其转换为字符串,则得到上面的表示形式,无论我使用的是不变区域性、da DK还是en US
有趣的是,如果我在第3步和第4步之间添加一些代码(见下文),将所有0值替换为新的0值,那么该值将正确转换,并在Excel中显示为0
foreach (DataRow row in projektTable.Rows)
foreach (DataColumn column in projektTable.Columns)
if (column.DataType == typeof(decimal))
if (row.Field<decimal>(column) == 0)
row.SetField<decimal>(column, 0);
foreach(projektable.Rows中的数据行)
foreach(projektable.Columns中的DataColumn列)
if(column.DataType==typeof(十进制))
if(行字段(列)==0)
行设置字段(列,0);
我希望有人具有我所缺乏的卓越洞察力,因为我不明白为什么2个十进制0可以转换为2个不同的字符串表示形式
编辑:很抱歉忘记了数据库类型。该列为十进制(18,4)
编辑2:只是为了澄清。在任何时候我都不能做像decimal.Parse之类的事情。
我通过EF加载数据,因此由于实体上的属性,数据类型是强类型的。然后将数据加载到at DataTable中—使用属性上的反射找到列的类型。
然后,通过使用行[rowX][columnX]将数据写入Excel,以获取作为对象的值(不管该值是否为十进制、日期时间、字符串等)。然后使用我上面发布的string.Format()代码将该对象转换为字符串。数据库中的类型是什么?如果你将decimal.GetBits与EF获取的值一起使用,结果是什么?任何科学家都会告诉你它们不是同一个数字。他们非常习惯于这样一种观点,即大自然不会用十个手指来计数,任何测量都是不精确的。0.00000000000000比0精确得多。decimal和Excel都知道的东西。可能的不幸是,dbase列是一个字符串而不是一个数字,因此您在编写值的代码中复制了一个错误。您可能不想忽略Excel单元格的格式。我们已经讨论过类似的部分。希望它能给我们一些启示。。此外,当我们遇到这种情况时,虽然不是针对excel,但我们使用了amount.ToString(“N”,nfi),其中nfi是NumberFormatInfo,我们设置了属性并作为输入提供。“我不明白为什么2个十进制0可以转换为2个不同的字符串表示形式”-这是标准行为-a
decimal
“知道”它有多精确,因此尽管1m==1.000m
这两个变量在内存中有不同的表示形式,ToString()
显示了它们的精度。有趣的问题是“为什么我得到二十个0
s而不是四个?”和“为什么我只得到零值?”因为当我尝试这个方法时,我(a)从decimal(18,x)
SQL列中得到x
零,并且(b)在0m
和1m
输入中都得到它们。