输入字符串格式不正确。将字符串转换为双精度数。

4

我是一个C#初学者,将空字符串转换为double类型可以在button1_click事件下进行...但是在Public Form1()下进行会出现以下错误:

输入的字符串格式不正确。

这里是代码...(包括form1.cs和Guy.cs类)

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;

 namespace WindowsFormsApplication1
 {
     public partial class Form1 : Form
     {
        public Form1()
        {
            InitializeComponent();

            guy1 = new Guy() ;
            guy1.guyname = textBox1.Text;                
            guy1.guycash = double.Parse(textBox2.Text);
        }                 

    }

    Guy guy1 ;

    private void button1_Click(object sender, EventArgs e)
    {

        label5.Text = guy1.TakeCash(double.Parse(textBox3.Text)).ToString();

    }
 }


}

代码文件 Guy.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    class Guy
    {
        private string name;
        private double cash;

        public string guyname
        {
            get { return name; }
            set { name = value; }
        }

        public double guycash
        {
            get { return cash ; }
            set { cash = value; }
        }



        public double TakeCash(double amount)
        {
            if (cash > amount)
            {
                cash -= amount;
                return cash;
            }
            else
            {
                MessageBox.Show("Not enough Cash.");
                return 0;
            }
        }


    }
}

错误是由于guy1.guycash = double.Parse(textBox2.Text);这一行引起的,当我在它之前的If()中尝试使用double.TryParse(textbox2.Text, out x)时,它返回false。
请问如何解决这个问题? 提前感谢。

@rafael - 展示一下你的代码,它没有运行。 - Scott Smith
你如何进行转换? - fretje
用户的Windows语言环境是什么? 有时在字段中插入像“0,001”这样的值不会正确地转换为“0.001”,而是变成了无效的“0,001.0”。 - SparK
3个回答

4

继续astanders的回答:

double d;
if(!Double.TryParse(textBox2.Text, out d)){
    return; // or alert, or whatever.
}

guy1 = new Guy() ;
guy1.guyname = textBox1.Text;                
guy1.guycash = d;

你正在尝试解析输入的内容,如果失败了,就会采取其他行动。由于用户可以输入任何他们想要的内容,因此这保证了如果您无法解析输入(因为它不是十进制数),您可以很好地处理它并告诉他们修复他们的输入。


好的,现在运行得很好,但问题是如果我使用return;它将跳过guy1 = new Guy();这将使整个Guy类无法使用,即使我使用警告消息而不是return;它也会为textbox2分配一个永久的0值,那么程序将始终给出“没有足够的现金”消息...所以我必须给textbox2一个固定的值,奇怪的是,在运行时,即使我改变了它,程序仍然使用它的初始值!! - rafael
嘿,Rafael,无意冒犯,但我认为你应该看一本入门编程书。我给出的答案解决了问题,但你需要更好地掌握一些基础知识 :)。 - Jerod Venema
@Rafael - 你可能还想重写OnClosing()方法,以捕获用户按下Enter键并关闭窗体的情况。 - Scott Smith
@Rafael和jvenema - 是的,听起来你们可能想要注释掉Guy代码,并在构造函数和其他方法中放置消息框或断点。运行代码(甚至更好的是,在调试器中逐步执行它),并查看每个方法何时被执行(以及按什么顺序执行)。这可能会使事情变得更加清晰。 - Scott Smith

2
这应该没问题。
double d;
Double.TryParse(String.Empty, out d);

双重尝试解析方法(Double.TryParse Method),参数为字符串和双精度浮点数。点击此处了解更多信息。

谢谢,但我已经尝试过了。当我将它作为条件放入if()中时,它返回false,并且转换没有进行。 - rafael

1

看起来问题是您没有处理不正确的用户输入。您正在尝试从文本框解析字符串到双精度浮点数,但没有任何提示表明它可能无法解析正确(例如用户可以在文本框中输入'abcd')。您的代码应该使用TryParse方法,在输入无法解析时显示错误消息。

我猜解析失败是因为非数字输入或者由于文化差异问题(例如用户使用“,”作为小数符号,但您的程序却将其视为“.”)。


1
问题是,我希望文本框2不保留任何值,以便用户可以输入他们想要的现金金额。但是当form1启动初始化时,它将检查它是否具有数字值,并根据此采取行动!但是我希望它保持为空! - rafael
啊,好的。嗯,你试图在表单构造函数中获取字段的内容。这是在表单甚至还没有显示给用户之前,你得到的字符串可能为空,所以你总是无法从空字符串中解析出一个双精度浮点数。 - Scott Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接