将字符串转换为整数

10

可能重复:
如何将字符串转换为整数?

你好,

我遇到了将字符串转换为整数的问题:

string str = line.Substring(0,1);

//This picks an integer at offset 0 from string 'line' 

现在字符串 str 中只包含一个整数。我正在执行以下操作:

int i = Convert.ToInt32(str);

如果我按照以下语句写,应该会打印出一个整数,对吗?

Console.WriteLine(i);

代码编译无误,但在运行时却出现以下错误:

未经处理的异常类型“System.FormatException”发生于 mscorlib.dll 中。

更多信息:输入字符串格式不正确。

请问有什么帮助吗?


请使用您正在使用的编程语言为此添加标签。 - sal
如果您可以提供行变量内的字符串值,那么检测错误就会更容易。 - rahul
这是一个重复的问题,可以参考以下链接:https://dev59.com/MHNA5IYBdhLWcg3wS70m,https://dev59.com/G0fSa4cB1Zd3GeqPAt_W,https://dev59.com/skfRa4cB1Zd3GeqP-6nR。 - Andrew Hare
5个回答

19
与其使用 Convert.ToInt32(string) 方法,您应该考虑使用 Int32.TryParse(string, out int) 方法。TryParse方法可以以更安全的方式处理用户提供的输入。最有可能导致错误的原因是您返回的子字符串具有无效的整数值的字符串表示形式。

相较于使用Convert.ToInt32(string),你应该考虑使用Int32.TryParse(string, out int)。TryParse方法可以更安全地处理用户提供的输入。造成错误的最可能原因是您所返回的子字符串具有无效的整数值的字符串表示形式。

string str = line.Substring(0,1);
int i = -1;
if (Int32.TryParse(str, out i))
{
   Console.WriteLine(i);
}

谢谢你提供的代码。由于我现在无法访问我的工作站,我明天会尝试它。明天我会在这里更新输出结果,无论结果如何,再次感谢。 - zack
在提供的示例中,将i设置为-1的原因是什么?这让我想到,在解析失败后,您可以以某种方式测试-1,但如果解析失败,则TryParse会将i设置为0。 - John Lewin

1

FormatException

值不是一个可选符号后面跟着数字 (0 到 9) 的序列。

当参数的格式不满足调用方法的参数规范时引发的异常。

如果你不想生成这样的异常,可以使用Int32.TryParse

Int32.TryParse:将数字的字符串表示形式转换为其 32 位带符号整数等效项。返回值指示操作是否成功。


0

很可能您的输入格式是无效的。请尝试使用以下方法。如果数字无效,则应输出错误。

请记住,字符串应由可选符号后跟数字组成。

string line = "23"; // or whatever.
string str = line.Substring(0,1);
int i = 0;
if (Int32.TryParse(str, out i)) {
   Console.WriteLine(i);
} else {
    Console.WriteLine ("Error converting '" + line + "', '" + str + "'.");
}

你可能会遇到的一件事是用户输入了例如"-1"。如果你对其进行substring(0,1)操作,你只会得到"-",这并不是有效的。

0

有可能字符串中含有一些空格,请尝试运行类似于 trim() 的函数(我不确定你使用的是哪种编程语言),以去除空格。此外,尝试打印出字符串,确保你选择的是正确的部分。我们都犯过这样的错误 :)


当我使用Console.WriteLine(str)在控制台输出字符串时,它会打印出一个符号(基本上是一个笑脸),由于我将计数设置为1,所以除了整数(作为笑脸打印出来)之外,不可能有其他字符。顺便说一下,我正在使用Visual Studio 2005中的C#。 - zack
1
如果控制台无法将其打印为任何整数,那么我猜它不是一个整数。我可能在这里错了,但我对这个方法的理解是将表示整数的字符串转换为整数数据类型的表示,比如将"1234"转换为可以进行数学运算的整数表示,你是想要做这样的操作吗? - Chris Thompson

0

你确定 str 返回的值是一个整数吗?如果你在使用 Visual Studio,可以设置一个调试断点。我有一种感觉,你的问题可能是你实际上没有返回一个整数。尝试:

line.Trim().Substring(0,1);

这将删除任何空格。


Trim() 只会从字符串的开头和结尾删除空格,因此根据原始字符串包含的内容,这并不能保证解决问题。 - Scott Dorman
是的,但由于子字符串是(0,1),这将始终是开头,可能也是结尾。 - StarSignLeo

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