2016-09-12 15 views
0

文字列を使用していて、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」ですが、それはように「21.56」だとするとき、「価格」は私にエラーが発生しますので、int型であることを気にしません。私は何が欠けていますか?

「日付」を「8/31/16」のときに「DateTime」にするのにも問題がありますが、実際には文字列ではなく3つの整数にする必要があると仮定しています。

編集 私はスウェーデン出身ですが、それは文化の問題だと思われました。小数点の代わりにカンマを使用しています。誰かが好奇心が強い場合のためのコードはここにありますが、私は確かにこれをやるよりエレガントな方法があります。

 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; 
    } 
+1

正しいタイプのカラムを設定してから、正しいタイプのCXV値を解析します。 [culture](http://stackoverflow.com/a/5238137/4625305)、 – AXMIM

+1

"give me errors"に注意してください。 **どちらのエラー? –

答えて

3

データの種類ごとに文字列を使用しないでください。(私は戻って C#数年でコードを書き始めたとき、私は同じミスを犯しました)。 Decimal,DoubleおよびDateTimeのタイプがこの種のデータを処理するために作成されます。

はあなたがDateTime

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

Columns.Addは、オブジェクト配列を受け取り使用する必要があり、日付の価格

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

ためdecimalタイプを使用する必要があります。したがって、文字列の値がこれらの型に安全に変換できる限り、コードは機能するはずです。

たとえば、次のコードは正常に動作します。 fields配列内の項目は、文字列型である、彼らは安全にDateTimedecimal(日付と価格の列については)に変換することができるにもかかわらず

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]); 

0

フィールドを文字列として読み取っています。最終パラメータを10進数に変換する必要があります。文字列でないすべてのフィールドには良い考えです。 DateTimeフィールドには、月/日/年の順番を扱う書式設定パラメータを追加できます。

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

NOTE - 私はあなたのパーサがフィールドのフォーマットをチェックしていると仮定しています - そうでなければ、試しにコードをラップする必要があります - 不正な形式のデータをキャッチします。

関連する問題