C# 字符串的格式错误#

C# 字符串的格式错误#,c#,C#,我试图弄明白为什么当我运行我的程序并按下提交按钮时,我得到一个错误,说我的列表格式错误。关于这个程序的一点背景:它是为我的可视化编程课准备的。该程序适用于银行账户。我试着对每个部分的内容进行评论,以使其更易于阅读 public partial class Form1 : Form { public Form1() { InitializeComponent(); } //Tab 1 Create and close account pri

我试图弄明白为什么当我运行我的程序并按下提交按钮时,我得到一个错误,说我的列表格式错误。关于这个程序的一点背景:它是为我的可视化编程课准备的。该程序适用于银行账户。我试着对每个部分的内容进行评论,以使其更易于阅读

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();
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
//表1创建和关闭帐户
私有void Submitbtn_单击(对象发送方,事件参数e)
{
双x;
if(OpenRdo.Checked==true&&Nametxtbx.TextLength>0)
{
double.TryParse(Nametxtbx.Text,out x);
//单击按钮后,将显示
//没有数字,上面写的是system.random
随机账户=新随机账户();
int AccountNumber=acct.Next(51000);
outputlbl.Text=acct.ToString();
}
//账目清单
//这就是它说我有错误的地方
//我的名单格式不对
var账户=新列表
{
新帐户(Nametxtbx.Text,double.Parse(outputlbl.Text),0)
};
//将这些记录写入文件
书面文件(帐目);
//创建帐户时的消息框
if(ValidateChildren(ValidationConstraints.Enabled))
{
MessageBox.Show(“已创建帐户”、“消息”,
MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
//写入文件
静态无效写文件(列表帐户)
{
StreamWriter outputFile=File.CreateText(“accounts.txt”);
字符串记录;
foreach(账户中的var账户)
{
记录=$“{acct.Name},{acct.Balance}”;
WriteLine($“写入记录:{record}”);
outputFile.WriteLine(记录);
}
outputFile.Close();
}
}

我建议,如果不知道文本框中的内容,不要只解析文本。 我宁愿做这样的事

if(double.TryParse (outputlbl.Text, out double outputNumber))
{
     new  Account(Nametxtbx.Text, outputNumber, 0);
}
另外,就我所知,请看一下

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

Random acct = new Random();                
int AccountNumber = acct.Next(5, 1000);
outputlbl.Text = acct.ToString();
您将标签设置为“System.Random”(因为您对错误的内容调用了ToString()。这是不可能在以后合理地转换成整数的


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

通常,异常的意思正是它所说的:根据使用的区域性(默认情况下从Windows检索),这不是有效的双精度。(a)注意错误消息所说的内容(它是英文的,您应该能够理解)。(B) 注意哪个方法调用哪个代码行会产生错误。(C) 您现在有了解决问题的知识。(D) 利润!;)看看你现在能不能把你的大型复制机压缩成一到三行的程序。这比你发布的代码更容易理解和诊断,其中95%与你的问题完全无关。@elgonzo:这还需要知道,你的文化中写数字的方式并不是唯一的写数字的方式。奇怪的是,很多说英语的人直到遇到这个异常才明白这一点。这一行正确吗(是否
Nametxtbx
应该包含一个double?):
double.TryParse(Nametxtbx.Text,out x)
另外,
TryParse
调用通常是
if
条件的一部分(其中
else
将向用户显示一些消息,说明他们需要输入有效号码)。另外,在这个方法之后,您永远不会使用变量
x
,那么它的目的是什么呢?TryParse主要是为了避开令人烦恼的异常。他仍然需要理解为什么会发生这种异常,以及如何避免它。否则他将得到无法解释的0回报。这是完全正确的。但在我看来,TryParse更容易调试和理解,特别是对于初学者。对话错误是错误格式提供程序的一个很好的提示。作为附加注释,您不应该每次按下按钮时都创建一个新的
Random()
对象。在整个程序中,一次只能创建一个实例,就像一个单实例一样。@Icemanind:哦,对了,也是这样。对于button,问题不会那么大,但通常是由于它们是如何初始化的。如果在同一毫秒内创建许多随机数并给出相同的“下一个”顺序,它们将返回相同的值。最好在周围保留几个随机实例。@Icemanind如果在整个程序中使用一个随机实例,则还需要处理线程安全问题。@Magnus随机快速创建随机实例,这在历史上造成了更多问题。但我同意,这是一个问题,因为您应该只有一个实例,但还需要以线程方式使用它: