我有一个DataTable
,其中有几个DataRow
我想在新的DataTable
中格式化,但是在尝试格式化某些行时发现了一个问题:
DataTable ret = functionThatGetsaDataTableUsingSQL(); //Original DataTable
DataTable dt = new DataTable(); //Final DataTable
foreach (DataRow dr in ret.Rows)
{
DataRow row = dt.Rows.Add();
for (int j = 0; j < dr.ItemArray.Length; j++)
{
if (j == 14) row[j] = dr.ItemArray[j].ToString("C2");
else row[j] = dr.ItemArray[j];
}
}
row[j] = dr.ItemArray[j].ToString("C2");
不能显示No overload for method 'ToString' takes 1 arguments
我试图尽可能简化代码,以便仅关注格式化部分。
如何格式化该值?我知道我可以在使用
Convert.ToDecimal()
之前先投射ToString("C2")
,但这是唯一的方法吗? 最佳答案
ItemArray
是object[]
。 Object.ToString
没有参数。我想这实际上是一种货币价值。然后使用DataRow.Field
扩展方法进行转换:
foreach (DataRow dr in ret.Rows)
{
DataRow row = dt.Rows.Add();
for (int j = 0; j < dr.ItemArray.Length; j++)
{
if (j == 14)
row[j] = dr.Field<decimal>(j).ToString("C2"); // use the correct type
else
row[j] = dr.ItemArray[j];
}
}
这是一个优化的版本,
ItemArray
-property具有额外的开销,因为getter总是创建一个新数组(如您看到的here):foreach (DataRow dr in ret.Rows)
{
DataRow row = dt.Rows.Add();
foreach(DataColumn col in ret.Columns)
{
if (col.Ordinal == 14)
row.SetField(col.Ordinal, dr.Field<decimal>(col).ToString("C2")); // use the correct type
else
row.SetField(col.Ordinal, dr[col]);
}
}
关于c# - ItemArray转换为格式无效的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35648950/