【问题标题】:Leading zeros are not adding to DataTable columns C# Asp.Net with PadLeft or String.Format前导零不会添加到带有 PadLeft 或 String.Format 的 DataTable 列 C# Asp.Net
【发布时间】:2016-06-01 23:53:05
【问题描述】:

前导零不会添加到具有 PadLeft 或 String.Format 的 DataTable 列中。

最初我将用户上传的 excel 数据复制到 Datatable。如果长度小于 8 位,我会尝试在数据表列值前面添加零,然后我必须与另一个表进行比较以匹配记录。如果我没有前导零,我在与其他数据表列匹配时会丢失这些记录。但我希望它们带有前导零,以便可以匹配它们以获得正确的结果。

例如:我在数据表中有一个“CODE”列,其值为 30500、501080、5020900、19010300 等,我希望得到类似 00030500、00501080、05020900、19010300 的结果

注意:我希望更改数据表中的数据,而不是在检索数据的 sql 查询中。 我不想要将 int 转换为字符串前导零的代码。即使我尝试过这种方式也不能解决我的问题。

我尝试了几种方法,但都没有解决。 我的代码有什么问题。它不起作用。我在How to add leading zeros in DataTable columns 的下面使用过,但仍然没有改变任何东西。不要认为这篇文章是重复的,因为我尝试了所有方法但仍然存在问题,因此在这里发布。

方法一:

 foreach (DataRow row in dataExcelInputTable.Rows)
                {
                    row["CODE"] = row["CODE"].ToString().PadLeft(8, '0');
                }
                dataExcelInputTable.AcceptChanges();

方法2:

foreach (DataRow drin dataExcelInputTable.Rows)
                {
                   dr["CODE"] = String.Format("{0:00000000}", int.Parse(dr["CODE"].ToString()));
                }
                dataExcelInputTable.AcceptChanges();

方法 3:

               int countSize = 0;
                int val = 0;
                foreach (DataRow row in dataExcelInputTable.Rows)
                {
                    countSize = row["CODE"].ToString().Length;
                    val = int.Parse(row["CODE"].ToString());
                    if (countSize < 8)
                    {

                        row["CODE"] = val.ToString("D8");

                        //Response.Write("<br/>" + val.ToString("D8"));
                    }

                }
                dataExcelInputTable.AcceptChanges();

更新:

foreach (DataRow row in dataExcelInputTable.Rows)
                {
                    if (row["CODE"].ToString().Length < 8)
                    {
                        row["CODE"] = row["CODE"].ToString().PadLeft(8, '0');
                    }
                    Response.Write("<br/>" + row["CODE"]);
                }
                dataExcelInputTable.AcceptChanges();

现在它在下面打印,它没有在前面填充零。

9040100 (

10020300 (=8) , 10030300 (=8) , 11010100 (=8)

【问题讨论】:

  • 检查数据列的大小(在具有数据类型的数据表中)。
  • 请参考我的最新更新。输出它打印
  • 嗨,Sami,我发现“CODE”列的数据类型是 Double。你这是导致问题的原因吗?如果我将其更改为字符串,它会起作用吗?

标签: c# asp.net .net datatable oledb


【解决方案1】:

我试过了,得到了预期的输出......下面是一个测试代码

        System.Data.DataTable dt = new System.Data.DataTable();
        dt.Columns.Add("Code");
        System.Data.DataRow r = dt.NewRow();
        r["Code"] = "30500";
        dt.Rows.Add(r);

        foreach (System.Data.DataRow row in dt.Rows)
        {
            row["CODE"] = row["CODE"].ToString().PadLeft(8, '0');
        }
        dt.AcceptChanges();

//dt.Rows[0][0]值为00030500

【讨论】:

  • 是的,它适用于固定值。实际上我正在从用户上传的 .ibfs 文件(excel 类型)中填充数据表,在我的情况下,相同的代码不起作用。
  • Nemeric/Decimcal 数据类型不能包含前缀零,请确保不是这种情况。
【解决方案2】:

终于找到了一个解决方案,感谢 Sami 对 Datatype 的想法。我发现 Datatype 是 double 但我需要使用 PadLeft 方法填充左零的字符串。 因为从 excel 表中填充数据后,我无法更改数据表的数据类型。我克隆到一个新的数据表,然后将它的数据类型更改为字符串。下面是示例代码。

                dtCloned = dataExcelInputTable.Clone();
                dtCloned.Columns[1].DataType = typeof(System.String); // clone the datatble and make a column datatype to string
                foreach (DataRow row in dataExcelInputTable.Rows)
                {
                    dtCloned.ImportRow(row);
                }

                foreach (System.Data.DataRow row in dtCloned.Rows)
                {
                    row["CODE"] = row["CODE"].ToString().PadLeft(8, '0');
                    Response.Write("<br/>" + row["CODE"]);
                }
                dtCloned.AcceptChanges();

这是按预期工作的。但我一直在寻找除克隆之外的任何直接简单的方法?我从https://msdn.microsoft.com/en-us/library/dd260048%28v=vs.110%29.aspx 尝试过,但它不起作用。给我一个错误“方法 'ToString' 没有重载需要 1 个参数”。

            string fmt = "00000000.##";
            foreach (System.Data.DataRow row in dataExcelInputTable.Rows)
            {
                row["CODE"] = row["CODE"].ToString(fmt);
                Response.Write("<br/>" + row["CODE"]);
            }

【讨论】:

  • 很高兴能帮助您,Priya。 Double 不能存储像 '000300' 之类的值,而是转换为 "300" 。如果是这种情况,请接受我的回答。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多