在数据表中的列中使用decimal

时间:2016-09-12 15:40:45

标签: c#

只要我使用字符串,只要我的int是偶数,我就可以使数据表正常,但是当我想使用带有句点的数字时,我会收到错误。

        static DataTable GetTable()
    {            
        DataTable table = new DataTable();

        table.Columns.Add("Date", typeof(string));
        table.Columns.Add("Item Name", typeof(string));
        table.Columns.Add("Buyer", typeof(string));
        table.Columns.Add("Quantity", typeof(int));
        table.Columns.Add("Price", typeof(string)); //I want this to be a decimal or whatever


        using (TextFieldParser parser = new TextFieldParser("c:\\folder\\sold.csv"))
        {
            parser.CommentTokens = new string[] { "#" };
            parser.SetDelimiters(new string[] { "," });
            parser.HasFieldsEnclosedInQuotes = true;

            parser.ReadLine();

            while (!parser.EndOfData)
            {
                string[] fields = parser.ReadFields();

                table.Rows.Add(fields[0], fields[1], fields[2], fields[3], fields[4]);
             }
        }
        return table;
    }

"数量"不要介意成为一个整体,因为它是一个" 1"或者" 2"但是" Price"当它的#21; 21.56"" 21.56"等等。我错过了什么?

我也遇到了问题"日期"成为" DateTime"当它" 8/31/16"但我假设这是因为它实际上需要三个整数而不是一个字符串...

编辑 这似乎是一个文化问题,我来自瑞典,我们使用逗号而不是小数。如果有人对此感到好奇,请参考以下代码,我确信这样做的方式更为优雅。

        static DataTable GetTable()
    {            
        DataTable table = new DataTable();

        table.Columns.Add("Date", typeof(DateTime));
        table.Columns.Add("Item Name", typeof(string));
        table.Columns.Add("Buyer", typeof(string));
        table.Columns.Add("Quantity", typeof(int));
        table.Columns.Add("Price", typeof(decimal));

        using (TextFieldParser parser = new TextFieldParser("c:\\folder\\sold.csv"))
        {
            parser.CommentTokens = new string[] { "#" };
            parser.SetDelimiters(new string[] { "," });
            parser.HasFieldsEnclosedInQuotes = true;

            parser.ReadLine();

            while (!parser.EndOfData)
            {
                string[] fields = parser.ReadFields();

                table.Rows.Add(DateTime.ParseExact(fields[0], "MM/dd/yy", null), fields[1], fields[2], int.Parse(fields[3]), Convert.ToDecimal(fields[4], new CultureInfo("en-US")));
            }
        }
        return table;
    }

2 个答案:

答案 0 :(得分:5)

不要对每种类型的数据使用字符串。(我几年前开始用C#编写代码时犯了同样的错误)。创建了DecimalDoubleDateTime类型来处理此类数据。

您应该使用decimal类型的价格

table.Columns.Add("Price", typeof(decimal));

到目前为止,您应该使用DateTime

table.Columns.Add("Date", typeof(DateTime));

Columns.Add接受一个对象数组。因此,只要您的字符串值可以安全地转换为这些类型,您的代码就可以正常工作。

例如,下面的代码可以正常工作。

DataTable table = new DataTable();

table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("Item Name", typeof(string));
table.Columns.Add("Buyer", typeof(string));
table.Columns.Add("Quantity", typeof(int));
table.Columns.Add("Price", typeof(decimal));

string[] fields = {"12/12/2013","test","Hello","3","345.45"};
table.Rows.Add(fields[0], fields[1], fields[2], fields[3], fields[4]);

尽管fields数组中的项目是字符串类型,但它们可以安全地转换为DateTimedecimal For Date and Price列)。

答案 1 :(得分:0)

您正在将字段作为字符串读取 - 您需要将最终参数转换为Decimal。对于所有不是字符串的字段,这是一个好主意。对于DateTime字段,您可以添加格式参数,以处理月/日/年订单。

table.Rows.Add(DateTime.Parse(fields[0]), fields[1], fields[2], 
     int.Parse(fields[3]), Decimal.Parse(fields[4]));

注意 - 我假设您的解析器正在检查字段的格式 - 否则您将需要将代码包装在try-catch中以获取格式错误的数据。