c语言输入字符串的格式不正确的是,关于c#:输入字符串的格式不正确

在C#中,遇到输入字符串格式不正确的错误,主要是由于尝试将非整数字符串转换为整数。本文讨论了该问题的常见原因,包括数值超出整型范围、包含非数字字符、使用了不匹配的区域设置等,并提供了相应的解决方案,如使用`Int32.TryParse`方法进行安全转换。同时,文章还提到了其他编程语言(如Java)中类似问题的对比和处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是一个新的C语言,我有一些基本的Java知识,但是我不能让这个代码正常运行。

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

7478c5d513b7d0eeff4576c9ffa38d86.png

我做了几乎相同的程序,但在JAVA中使用jSnand,它工作得很好。

这是C的形式:

d0190b45fd8021f1cc42adac19b21712.png

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 ="";

}

}

有什么问题?有办法解决吗?

附:我也试过了

a = Convert.ToInt32(textBox1.text);

b = Convert.ToInt32(textBox2.text);

但它不起作用。

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

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

尝试转换时,也可能引发此错误消息。若要从具有不同CultureInfo的用户进行双输入混合,则可以使用Convert.ToDouble(String,?而不仅仅是convert.todouble(字符串)。很难调试,因为程序将在您的系统上工作,但会向某些用户抛出错误,这就是为什么我有一个方法在服务器上记录错误,并且我很快发现了这个问题。

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

希望这能帮助其他人找到这个问题,但不分析数字数据。

如果不明确验证文本字段中的数字,则最好使用

int result=0;

if(int.TryParse(textBox1.Text,out result))

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

通常,不需要初始化result。

问题

出现错误的可能原因有:

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

因为textBox1.Text包含:

a)非数字(除开头/结尾的space、开头的-)和/或

b)代码的应用区域性中的千个分隔符,未指定NumberStyles.AllowThousands或指定NumberStyles.AllowThousands但在区域性中输入了错误的thousand 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)OK

a = Int32.Parse("-189"); //having - but in the beginning

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

案例2 B)OK

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

另外,你可以考虑

使用TryParse而不是Parse,以确保未解析的数字不会导致异常问题。

检查EDOCX1[13]的结果,如果不是EDOCX1[16]则处理。

int val;

bool result = int.TryParse(textbox1.Text, out val);

if (!result)

return; //something has gone wrong

//OK, continue using val

在我的情况下,我忘记了放双花括号逃跑。{{MyObjult}}

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

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

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

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

这也是我的问题。在我的例子中,我把波斯语号码改成拉丁语号码,它起作用了。在转换之前还要修剪你的绳子。

PersianCalendar pc = new PersianCalendar();

char[] seperator ={'/'};

string[] date = txtSaleDate.Text.Split(seperator);

int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值