【问题标题】:String is in wrong format c# [duplicate]字符串格式错误c# [重复]
【发布时间】:2019-03-26 22:25:25
【问题描述】:

我试图弄清楚为什么当我运行我的程序并按下提交按钮时,我收到一条错误消息,指出我的列表格式错误。该程序的一些背景知识:这是针对我的可视化编程课程的。该程序适用于银行帐户。我试图评论每个部分的内容以使其更易于阅读

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //Tab 1 Create and close account
    private void Submitbtn_Click(object sender, EventArgs e)
    {
        double x;

        if (OpenRdo.Checked == true && Nametxtbx.TextLength > 0)
        {
            double.TryParse(Nametxtbx.Text, out x);

            // after clicking the button there is
            // no number; it says system.random
            Random acct = new Random();                
            int AccountNumber = acct.Next(5, 1000);
            outputlbl.Text = acct.ToString();
        }

        // list for accounts 
        // This is where it says I have the error
        // that my list is in the wrong format
        var accounts = new List<Account>
        {
            new  Account(Nametxtbx.Text, double.Parse(outputlbl.Text), 0)
        };

        // Write these records to a file
        WriteFile(accounts);

        // message box when you create account
        if (ValidateChildren(ValidationConstraints.Enabled))
        {
            MessageBox.Show("Account Created", "Message", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }

    //writing to the file
    static void WriteFile(List<Account> accts)
    {
        StreamWriter outputFile = File.CreateText("accounts.txt");
        string record;

        foreach (var acct in accts)
        {
            record = $"{acct.Name},{acct.Balance}";
            Console.WriteLine($"Writing record: {record}");
            outputFile.WriteLine(record);
        }

        outputFile.Close();
    }
}

【问题讨论】:

  • 通常,该异常的含义正是它所说的:根据使用的文化(默认情况下从 Windows 检索),这不是有效的双精度。
  • (A) 注意错误信息的内容(是英文的,应该能看懂)。 (B) 注意哪个代码行的哪个方法调用产生了错误。 (C) 你现在有了解决问题的知识。 (D) 利润! ;)
  • 看看您现在是否可以将大型复制器缩减为一到三行的程序。这将比您发布的代码更容易理解和诊断,其中 95% 与您的问题完全无关。
  • @elgonzo:嗯,这还需要知道您的文化书写数字的方式并不是书写数字的唯一方式。奇怪的是,很多说英语的人在遇到这个例外之前都没有明白这一点。
  • 这一行是否正确(Nametxtbx 是否应该包含双精度?):double.TryParse(Nametxtbx.Text, out x); 此外,TryParse 调用通常是if 条件的一部分(其中else 将是向用户显示他们需要输入有效数字的消息)。另外,你在这个方法之后从不使用变量x,那么它的目的是什么?

标签: c#


【解决方案1】:

据我所知(这是相当多的代码),问题在于以下几行:

Random acct = new Random();                
int AccountNumber = acct.Next(5, 1000);
outputlbl.Text = acct.ToString();

您将标签设置为“System.Random”(因为您在错误的事情上调用了 ToString())。而且以后不能明智地将其转换为整数。

理想情况下,您甚至不应该从 UI 中检索数据。如果后面的代码中有一个整数,请将其保留在那里。用它。但是事件之间的分离可能并不总是可能的。

【讨论】:

  • 作为附加评论,您不应该在每次按下按钮时创建一个新的Random() 对象。您应该在整个程序中只创建一次实例,例如单例。
  • @Icemanind:哦,对了,也是。使用按钮它不会是一个大问题,但通常由于它们是如何初始化的,如果您在同一毫秒内创建大量随机数并给出相同的“下一个”顺序,它们都会返回相同的值。最好保留一些随机实例。
  • @Icemanind 如果您在整个程序中使用单个随机数,您还需要处理线程安全。
  • @Magnus 使用 Random 快速创建 Random 实例历来导致更多问题。但是同意,这是一个问题,因为您应该只有一个实例,但还需要在 Threadsavely 中使用它:docs.microsoft.com/en-us/dotnet/api/…
【解决方案2】:

我建议,如果您不知道文本框中的内容,请不要只解析文本。 而是做这样的事情

if(double.TryParse (outputlbl.Text, out double outputNumber))
{
     new  Account(Nametxtbx.Text, outputNumber, 0);
}

另外,看看formatprovider

【讨论】:

  • TryParse 主要是为了绕过 Vexing 异常。他仍然需要了解为什么会发生这种异常以及如何避免它。否则他将得到无法解释的 0 回报。 blogs.msdn.microsoft.com/ericlippert/2008/09/10/…
  • 完全正确。但在我看来,TryParse 更容易调试和理解,特别适合初学者。对话错误是错误格式提供者的一个很好的提示。
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多