格式为字符串的 ItemArray 无效
ItemArray to string with format is invalid
我有一个 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
我尽量简化代码,以便只关注格式化部分。
如何设置此值的格式?我知道我可以在使用 ToString("C2")
之前施放 Convert.ToDecimal()
但这是唯一的方法吗?
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 has additional overhead since the getter always creates a new array(as you can see 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]);
}
}
C2 表示它转换为小数点后两位的货币,但是如果你直接放置字符串它会转换什么 "jkld" ,所以必须让编译器知道你的源数据类型并且一旦它确定它是 double 类型那么它会像这样接受
正确的方法
double myPrice;
myPrice.ToString("C2");
这是理论上的答案,但您应该知道,以后您不会感到困惑,祝您编码愉快:)
您可以对任何东西使用 string.Format。
string.Format("{0:C2}", o);
将为 o 的任何类型和值进行编译。要利用这一点,您的代码将更改如下:
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] = string.Format("{0:C2}", dr.ItemArray[j]);
else row[j] = dr.ItemArray[j];
}
}
编辑:这并不意味着这是最好的方法 - 使用 Field 方法的答案可能更好,因为它既更快又更明确。
如果你要将这种格式应用于各种浮点(甚至整数)类型,而你在编写代码时不知道它们是什么类型,我的方法会更合适。
我有一个 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
我尽量简化代码,以便只关注格式化部分。
如何设置此值的格式?我知道我可以在使用 ToString("C2")
之前施放 Convert.ToDecimal()
但这是唯一的方法吗?
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 has additional overhead since the getter always creates a new array(as you can see 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]);
}
}
C2 表示它转换为小数点后两位的货币,但是如果你直接放置字符串它会转换什么 "jkld" ,所以必须让编译器知道你的源数据类型并且一旦它确定它是 double 类型那么它会像这样接受
正确的方法
double myPrice;
myPrice.ToString("C2");
这是理论上的答案,但您应该知道,以后您不会感到困惑,祝您编码愉快:)
您可以对任何东西使用 string.Format。
string.Format("{0:C2}", o);
将为 o 的任何类型和值进行编译。要利用这一点,您的代码将更改如下:
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] = string.Format("{0:C2}", dr.ItemArray[j]);
else row[j] = dr.ItemArray[j];
}
}
编辑:这并不意味着这是最好的方法 - 使用 Field 方法的答案可能更好,因为它既更快又更明确。
如果你要将这种格式应用于各种浮点(甚至整数)类型,而你在编写代码时不知道它们是什么类型,我的方法会更合适。