只要我使用字符串,只要我的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;
}
答案 0 :(得分:5)
不要对每种类型的数据使用字符串。(我几年前开始用C#编写代码时犯了同样的错误)。创建了Decimal
,Double
和DateTime
类型来处理此类数据。
您应该使用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数组中的项目是字符串类型,但它们可以安全地转换为DateTime
和decimal
( 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中以获取格式错误的数据。