101

我是 C# 新手,我有一些 Java 基础知识,但我无法让这段代码正常运行。

它只是一个基本的计算器,但是当我运行程序时 VS2008 给了我这个错误:

计算器

我做了几乎相同的程序,但是在使用 JSwing 的 java 中,它运行得很好。

这是c#的形式:

形式

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 calculadorac
{
    public partial class Form1 : Form
    {

    int a, b, c;
    String resultado;

    public Form1()
    {
        InitializeComponent();
        a = Int32.Parse(textBox1.Text);
        b = Int32.Parse(textBox2.Text);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        add();
        result();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        substract();
        result();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        clear();
    }

    private void add()
    {
        c = a + b;
        resultado = Convert.ToString(c);
    }

    private void substract()
    {
        c = a - b;
        resultado = Convert.ToString(c);
    }

    private void result()
    {
        label1.Text = resultado;
    }

    private void clear()
    {
        label1.Text = "";
        textBox1.Text = "";
        textBox2.Text = "";
    }
}

可能是什么问题?有没有办法解决它?

PS:我也试过

a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);

它没有用。

4

9 回答 9

132

该错误意味着您尝试从中解析整数的字符串实际上并不包含有效的整数。

创建表单时,文本框极不可能立即包含有效整数 - 这是您获取整数值的地方。a更新和按钮单击事件会更有意义b(与您在构造函数中的方式相同)。此外,请查看该Int.TryParse方法 - 如果字符串实际上可能不包含整数,它会更容易使用 - 它不会引发异常,因此更容易从中恢复。

于 2011-11-30T05:24:26.020 回答
66

我遇到了这个确切的异常,除了它与解析数字输入无关。因此,这不是对 OP 问题的回答,但我认为分享知识是可以接受的。

我声明了一个字符串,并将其格式化以与需要花括号 ({})的JQTree一起使用。您必须使用双花括号才能将其作为格式正确的字符串接受:

string measurements = string.empty;
measurements += string.Format(@"
    {{label: 'Measurement Name: {0}',
        children: [
            {{label: 'Measured Value: {1}'}},
            {{label: 'Min: {2}'}},
            {{label: 'Max: {3}'}},
            {{label: 'Measured String: {4}'}},
            {{label: 'Expected String: {5}'}},
        ]
    }},",
    drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"],
    drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"],
    drv["Min"] == null ? "NULL" : drv["Min"],
    drv["Max"] == null ? "NULL" : drv["Max"],
    drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"],
    drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]);

希望这将帮助其他发现此问题但未解析数字数据的人。

于 2014-10-23T16:01:44.813 回答
21

如果您没有明确验证文本字段中的数字,无论如何最好使用

int result=0;
if(int.TryParse(textBox1.Text,out result))

现在,如果结果是成功的,那么您可以继续进行计算。

于 2011-11-30T05:30:19.317 回答
13

问题

出现错误的可能情况有以下几种:

  1. 因为textBox1.Text只包含数字,但数字太大/太小

  2. 因为textBox1.Text包含:

    • a) 非数字(space开头/结尾、-开头除外)和/或
    • b)您的代码的应用文化中的千位分隔符未指定NumberStyles.AllowThousands或您指定NumberStyles.AllowThousandsthousand separator在文化中输入错误和/或
    • intc) 小数分隔符(解析中不应存在)

不行的例子:

情况1

a = Int32.Parse("5000000000"); //5 billions, too large
b = Int32.Parse("-5000000000"); //-5 billions, too small
//The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647

案例 2 a)

a = Int32.Parse("a189"); //having a 
a = Int32.Parse("1-89"); //having - but not in the beginning
a = Int32.Parse("18 9"); //having space, but not in the beginning or end

案例 2 b)

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands
b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator

案例 2 c)

NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!

看似不行,但实际上可以 示例:

案例 2 a) 好的

a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end

案例 2 b) 好的

NumberStyles styles = NumberStyles.AllowThousands;
a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture
b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture

解决方案

在所有情况下,请使用您的 Visual Studio 调试器检查 的值,textBox1.Text并确保它具有完全可接受的int范围数字格式。像这样的东西:

1234

此外,您可以考虑

  1. 使用TryParse而不是Parse确保未解析的数字不会导致您出现异常问题。
  2. 检查结果,TryParse如果没有则处理true

    int val;
    bool result = int.TryParse(textbox1.Text, out val);
    if (!result)
        return; //something has gone wrong
    //OK, continue using val
    
于 2016-04-19T08:21:10.087 回答
3

您没有提到您的文本框是否在设计时或现在具有值。表单初始化时,如果在表单设计时没有将文本框放入文本框,则文本框可能没有值。您可以通过在 desgin 中设置 text 属性将 int 值放入表单设计中,这应该可以。

于 2011-11-30T05:29:54.447 回答
3

就我而言,我忘了放双花括号来逃避。{{我的对象}}

于 2018-01-23T14:25:54.173 回答
2

当您使用带有无效括号语法的字符串格式化程序时,您可能会遇到此异常。

// incorrect
string.Format("str {incorrect}", "replacement")

// correct
string.Format("str {1}", "replacement")
于 2021-05-24T14:21:07.187 回答
0

这也是我的问题..在我的情况下,我将波斯号码更改为拉丁号码并且它有效。并且还在转换之前修剪你的字符串。

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
于 2015-12-10T14:54:59.993 回答
0

我有一个类似的问题,我用以下技术解决了:

以下代码行引发了异常(请参见下面用**装饰的文本):

static void Main(string[] args)
    {

        double number = 0;
        string numberStr = string.Format("{0:C2}", 100);

        **number = Double.Parse(numberStr);**

        Console.WriteLine("The number is {0}", number);
    }

经过一番调查,我意识到问题在于格式化的字符串包含 Parse/TryParse 方法无法解析的美元符号 ($)(即剥离)。因此,使用字符串对象的 Remove(...) 方法,我将行更改为:

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

那时 Parse(...) 方法按预期工作。

于 2018-06-07T16:51:25.800 回答