输入的字符串格式不正确


83

我是C#的新手,我具有Java的一些基本知识,但无法正常运行此代码。

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

计算器

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

这是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);

而且没有用

Answers:


111

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

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


2
当尝试从具有不同CultureInfo用户的用户输入的Convert.ToDouble输入时,也可能引发此错误消息,因此您可以使用Convert.ToDouble(字符串,IFormatProvider)而不是仅使用Convert.ToDouble(字符串)。调试起来很困难,因为程序可以在您的系统上运行,但是会向其某些用户抛出错误,这就是为什么我有一种方法可以在服务器上记录错误并迅速发现问题。
vinsa

58

我遇到了这个确切的例外,只不过它与解析数字输入无关。因此,这不是对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"]);

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


18

如果您未在文本字段中明确验证数字,则在任何情况下最好使用

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

现在,如果结果是成功,则可以继续进行计算。


11
通常result不需要初始化。
yazanpro 2015年

12

问题

在某些可能的情况下,为什么会发生错误:

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

  2. 因为textBox1.Text包含:

    • a)非数字(space开头/结尾,-开头除外)和/或
    • b)您的代码在应用的区域性中使用千位分隔符,但未指定NumberStyles.AllowThousands或指定,NumberStyles.AllowThousandsthousand separator在区域性和/或位置中输入了错误
    • c)十进制分隔符(在int解析中不应该存在)

不正确的示例:

情况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

解决方案

在任何情况下,请textBox1.Text使用Visual Studio调试器检查的值,并确保其具有范围的纯可接受数字格式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
    

3

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


3

就我而言,我忘了放双花括号逃脱。{{myobject}}


0

这也是我的问题..就我而言,我将PERSIAN编号更改为LATIN编号,并且它起作用了。并且在转换之前还修剪字符串。

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());

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(...)方法按预期工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.