格式为字符串的 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 方法的答案可能更好,因为它既更快又更明确。

如果你要将这种格式应用于各种浮点(甚至整数)类型,而你在编写代码时不知道它们是什么类型,我的方法会更合适。