簡體   English   中英

嘗試將字符串解析為double,得到“輸入字符串格式不正確”。

[英]Trying to parse a string to a double, getting “Input string was not in a correct format.”

我需要將數據表中的字符串解析為double。 我有一個數據表(dt),它有不同的列,每個列都使用.ToString()方法轉換為字符串。 但是,當我嘗試輸出數據的緯度和經度時,我收到錯誤“輸入字符串格式不正確”。 所以我想我的主要問題是,如何使用.ToString()方法解析轉換為字符串的對象中的文本。

using System;
using System.IO;
using System.Collections;
using System.Data;

namespace SalesMap
{
    class SalesMap
    {
        private static DataTable InitData1()
        {
            //Datatable for entire list of zipcodes
            DataTable datat = new DataTable("DATA");
            DataColumn state = new DataColumn();
            DataColumn county = new DataColumn();
            DataColumn statecounty = new DataColumn();
            DataColumn latitude = new DataColumn();
            DataColumn longitude = new DataColumn();
            DataColumn salesperson = new DataColumn();

            //Add the columns to the datatable
            datat.Columns.Add(state);
            datat.Columns.Add(county);
            datat.Columns.Add(statecounty);
            datat.Columns.Add(latitude);
            datat.Columns.Add(longitude);
            datat.Columns.Add(salesperson);

            return datat;
        }       

        private static String InitPath()
        {
            string path = "C:/Documents and Settings/Andre/Desktop/salesmapdata/MapPointCountyLatLong.csv";
            return path;
        }

        public static void Main()
        {
            try
            {
                DataTable dt = InitData1();
                StreamReader sr = new StreamReader(InitPath());
                String csvData = string.Empty;

                while ((csvData = sr.ReadLine()) != null)
                {
                    String[] data = csvData.Split(',');
                    //dt.Rows.Add(data);
                    DataRow newRow1 = dt.NewRow();
                    newRow1[0] = data[0].ToString(); //state
                    newRow1[1] = data[1].ToString(); //county
                    newRow1[2] = data[2].ToString(); //state|county
                    newRow1[3] = data[3].ToString(); //latitude
                    newRow1[4] = data[4].ToString(); //longitude
                    newRow1[5] = data[5].ToString(); //salesperson
                    dt.Rows.Add(newRow1);

                    Console.WriteLine("Row added for: dt");
                }

                foreach (DataRow row1 in dt.Rows)
                {
                    double latitude1 = Double.Parse(row1[3].ToString());
                    double longitude1 = Double.Parse(row1[4].ToString());

                    if (row1[5].ToString() != "UNKNOWN" || row1[5].ToString() != "SALESMAN")
                    {
                        Console.WriteLine(latitude1);
                        Console.WriteLine(longitude1);
                    }
                }

                dt.WriteXml(@"c:\test\dt1.xml");
                sr.Close();
            }

            catch (Exception e)
            {
                StreamWriter sw = new StreamWriter(@"c:\test\error.txt");
                sw.WriteLine(e.Message.ToString());
                sw.Close();
            }
        }
    }
}

首先,當從CSV文件讀取數據時,您不需要在每個數組元素上調用data[x].ToString() ,因為它們已經是字符串。

Double.Parse調用可能存在的幾個潛在問題:

  1. 您的CSV文件中的數據實際上格式錯誤(可能您錯放了列號,或者數據可能有一些無法解析的其他符號,如Tim在評論中提到的)。
  2. 列中有空字符串。 那些無法解析為加倍。 您需要首先檢查,使用string.IsNullOrWhitespace()或類似的東西。
  3. 你的文化錯了。 您可能在CSV文件中使用小數點的緯度和經度值,但您當前的線程文化可能使用逗號作為小數點分隔符。 Decimal.Parse()重載接受Culture作為參數(您可以提供CultureInfo.InvariantCulture或任何其他CultureInfo )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM