Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将十进制0转换为字符串将添加1000个分隔符和大量0';s_C#_Excel_Entity Framework_Openxml Sdk - Fatal编程技术网

C#将十进制0转换为字符串将添加1000个分隔符和大量0';s

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工作表 在应用程序中显示数据没有问题

我有一个问题,十进制0在转换为字符串时,会添加一个千位分隔符(根据其他值的转换方式判断丹麦格式)和许多尾随的0。 从我目前掌握的数据来看,这似乎与数据来自MSSQL这一事实有关,但这只是我的猜测

我现在做的是:

  • 数据存储在MSSQL数据库中
  • 我使用EntityFramework 6.0将这些数据加载到我的C#应用程序中
  • 然后将数据转换为数据表-列上的数据类型与POCO实体上相应属性的数据类型匹配
  • 然后使用OpenXml将DataTable中的数据写入Excel工作表
  • 在应用程序中显示数据没有问题,但在Excel中,我们遇到了上述问题,其中十进制值0显示为0.00000000000000

    首先,使用以下代码将所有值写入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
    输入中都得到它们。