【问题标题】:I cannot figure out how to fix an unhandled Format Excpetion我无法弄清楚如何修复未处理的格式异常
【发布时间】:2015-11-09 09:57:48
【问题描述】:

我正在尝试使用 Visual Studio 编写一个从文件读取数据并允许我对数据执行各种排序的 C# 程序。我是一个初学者,所以花了很多时间来弄清楚如何编写这段代码:现在我得到了:

格式异常未处理。输入字符串不正确 格式

我不确定我哪里出错了。以下代码行会发生这种情况:

Candidate newrec = new Candidate(str[0], str[1], str [2], str[3], str[4], str[5], str[6], Convert.ToInt32(str[7]), str[8], str[9], str[10], str[11]);

整个代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Collections;



namespace Unit4IP
{
   //used to sort in asceding and descending order
    public struct Candidate:IComparable 
    {

       public char[] _FirstName;
        public char[] _LastName;
        public char[] _Company;
        public char[] _Address;
        public char[] _City;
        public char[] _Country;
        public char[] _State;
        public char[] _Phone;
        public char[] _Fax;
        public char[] _Email;
        public char[] _Web;
        public int _zip;

        //for comparing objects
        public int CompareTo(object obj)
        {
            Candidate Candidate2 = (Candidate)obj;
            return _LastName.ToString().CompareTo(Candidate2._LastName.ToString());
        }
        //implements sorting based on assignments such as zip, lastname, etc. 
        public int CompareTo(Candidate Candidate2,
            CandidateComparer.ComparisonType comptype)
        {
            if(comptype==CandidateComparer.ComparisonType.Lastname)
            {
                    String _LName = new String(_LastName);
                    String LName = new String(Candidate2._LastName);
                    return _LName.CompareTo(LName);// Convert Character Array to String because CompareTo Works efficiently with Strings
            }
            else
            {
                    return Candidate2._zip.CompareTo(_zip); // compareto values that are interchanged in descending order
            }
        }
               //Constructor of Candidate Structure
         public Candidate(string FirstName, string LastName, string Company, string Address, string City, string Country, string State, int zip, string Phone, string Fax, string Email, string Web)
        {
            _FirstName = new char[12];
            _LastName = new char[16];
            _Company = new char[32];
            _Address = new char[32];
            _City = new char[24];
            _Country = new char[24];
            _State = new char[2];
            _Phone = new char[12];
            _Fax = new char[12];
            _Email = new char[32];
            _Web = new char[42];
            _FirstName = FirstName.ToCharArray();
            _LastName = LastName.ToCharArray();
            _Company = Company.ToCharArray();
            _Address = Address.ToCharArray();
            _City = City.ToCharArray();
            _Country = Country.ToCharArray();
            _State = State.ToCharArray();
            _zip = zip;
            _Phone = Phone.ToCharArray();
            _Fax = Fax.ToCharArray();
            _Email = Email.ToCharArray();
            _Web = Web.ToCharArray();
        }

         //Implement IComparer Interface as nested structure
         public struct CandidateComparer : IComparer
         {
             public enum ComparisonType
             { Lastname = 1, zip = 2 }
             private ComparisonType _comparisonType;
             public ComparisonType comptype
             {
                 get { return _comparisonType; }
                 set { _comparisonType = value; }
             }
             public int Compare(object x, object y)
             {
                 Candidate Candidate1 = (Candidate)x;
                 Candidate Candidate2 = (Candidate)y;

                 return Candidate1.CompareTo(Candidate2, _comparisonType);
             }
         }
    }
class Program
    {
        static void Main(string[] args)
        {
            ArrayList ArrayTest = new ArrayList();
            //Loading of File 'ITCO321_U4_sample_data.csv' into ArraList. File only holds values, no heading i.e. remove headings
            StreamReader stream1 = File.OpenText("c:\\Users\\Cdhss\\Documents\\ITCO321_U4IP_sample_data-2.csv");
            string recdata = null;
            while ((recdata = stream1.ReadLine()) != null)
            {
                string[] str = recdata.Split(',');
                Candidate newrec = new Candidate(str[0], str[1], str [2], str[3], str[4], str[5], str[6], Convert.ToInt32(str[7]), str[8], str[9], str[10], str[11]);
                ArrayTest.Add(newrec);//add struct object into ArrayList
            }
                        //Traversing of Records
            Console.WriteLine("Traversing Records");
            foreach (Candidate Candidate1 in ArrayTest)
            {
                string fname = new String(Candidate1._FirstName);
                string lname=new String(Candidate1._LastName);
                string company = new String(Candidate1._Company);
                string address=new String(Candidate1._Address);
                string city=new String(Candidate1._City);
                string country = new String(Candidate1._Country);
                string phone = new String(Candidate1._Phone);
                string fax = new String(Candidate1._Fax);
                string email=new String(Candidate1._Email);
                string web = new String(Candidate1._Web);
                Console.WriteLine( fname + "," + lname + "," + company + "," + address  + "," + city + "," + country + "," + Candidate1._zip + "," + phone + "," + fax + "," + email + "," + web);
            }
            Candidate.CandidateComparer comparer = new Candidate.CandidateComparer();
            //Sort by Lastname in ascending order
            comparer.comptype = Candidate.CandidateComparer.ComparisonType.Lastname;
            ArrayTest.Sort(comparer);
            Console.WriteLine("Sorting of Elements by LastName");
            foreach (Candidate Candidate1 in ArrayTest)
            {
                string fname = new String(Candidate1._FirstName);
                string lname = new String(Candidate1._LastName);
                string company = new String(Candidate1._Company);
                Console.WriteLine("\t" + fname + "," + lname + "," + company);
            }
            // Data sorted in desending order of ZIP field
            comparer.comptype = Candidate.CandidateComparer.ComparisonType.zip;
            ArrayTest.Sort(comparer);
            Console.WriteLine("Sorting of Elements by Zip");
            foreach (Candidate Candidate1 in ArrayTest)
            {
                string fname = new String(Candidate1._FirstName);
                string lname = new String(Candidate1._LastName);
                string company = new String(Candidate1._Company);
                Console.WriteLine("\t" + fname + "," + lname + "," + company + "," + Candidate1._zip);
            }

            //Display Records of 'NY' State
            Console.WriteLine("Display Records of NY State");
            foreach (Candidate Candidate1 in ArrayTest)
            {
                string fname = new String(Candidate1._FirstName);
                string lname = new String(Candidate1._LastName);
                string company = new String(Candidate1._Company);
                string address = new String(Candidate1._Address);
                string city = new String(Candidate1._City);
                string country = new String(Candidate1._Country);
                string phone = new String(Candidate1._Phone);
                string fax = new String(Candidate1._Fax);
                string email = new String(Candidate1._Email);
                string web = new String(Candidate1._Web);
                if (new String(Candidate1._State).Contains("NY"))
                    Console.WriteLine(fname + "," + lname + "," + company + "," + address + "," + city + "," + country + "," + Candidate1._zip + "," + phone + "," + fax + "," + email + "," + web);
            }
            Console.Read();
        }
    }
}

【问题讨论】:

  • 显示你正在阅读的文件
  • 顺便说一句:把你所有的属性(名字、姓氏等)放到一个类中并保存一个数组。
  • 显然,str[7] 在某些时候没有保存有效的整数值。将值写入控制台以查看它们的真实含义。
  • 文件太长,但它是一个包含以下 12 个标题的数据文件: 名字 姓氏 公司地址 城市 县 州 邮政电话 传真 电子邮件 网页 转换为 Pig Latin
  • 你必须学习如何在 .Net 中使用 debug 然后查看str[7] 的值。在此处发布价值,以便我们为您提供帮助。

标签: c# string


【解决方案1】:

您的问题在于您对 Convert.ToInt32 的调用。您传递的任何字符串都不能被解析为 int。

这里一个好的解决方案可能是使用一些结构化的异常处理,例如使用 try catch 块或 Int32.TryParse(string) 你可以这样做

int intValue;
if (Int32.TryParse(str[7], out intValue)) 
{
     //Do some thing with the int value
}
else
{
     throw new Exception("Some informative error message, probably using string.Format to include the string you tried to parse");
}

如果解析成功,TryParse 返回 true,否则返回 false,并将解析后的整数值放入第二个 out 参数中。

您编写的其他一些 cmets 代码可以帮助您。

  1. 没有人在 C# 中使用 ArrayLists。泛型是很久以前引入的,从类型安全和速度的角度来看,使用 List 几乎总是更好(如果您不知道它们是什么,请查阅 C# 泛型)。
  2. 您无需将 foreach 循环中的候选属性复制到新变量中。
  3. 提供更多信息变量名称。可读性是好的代码中最重要的一个品质。 fname 应该是 firstName,recdata 应该是 recievedData。在使用制表符完成的世界中,击键很便宜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多