前导零没有添加到带有PadLeft或String.Format的DataTable列C#Asp.Net

时间:2016-06-01 23:53:06

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

前导零没有使用PadLeft或String.Format添加到DataTable列。

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

Ex:我有一个专栏" CODE"在数据表中,值为30500,501080,5020900,19010300等,并希望得到我的结果,如00030500,00501080,05020900,19010300

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

我尝试了几种方法,但它没有解决。 我的代码有什么问题。它不能正常工作。我在How to add leading zeros in DataTable columns下面使用但仍未改变任何内容。不要认为这个帖子是重复的,因为我尝试了所有方法,但问题仍然存在,因此发布在这里。

方法1:

 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(&lt; 8),9070100(&lt; 8),9090200(&lt; 8),9090300(&lt; 8)

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

2 个答案:

答案 0 :(得分:1)

我试着在我的最后得到预期的输出......下面是一个测试代码

// Set options
$from_number="XXXXXXXXXX"; 
$start_date="2016-05-01";
$end_date="2016-05-31";

// Build the option array
$get_iterator_options = array(
   'from' => $from_number,
   'DateSent' => $start_date,
   'DateSent' => $end_date
);

// Make the call with our options
foreach ($client->account->message->getIterator(
        0,
        50, 
        $get_iterator_options
    ) as $message
) {
    $msg_ids[] = $message->sid; // 
}

echo count($msg_ids);

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

答案 1 :(得分:0)

最后得到了一个解决方案,谢谢Sami关于Datatype的想法。我发现Datatype是double,但是我需要使用PadLeft方法使用字符串来填充左边的零。 因为从excel表填充数据后我无法更改数据表的数据类型。我克隆到一个新的Datatable,然后将其数据类型更改为string。以下是示例代码。

                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"]);
            }