C#将字符串转换为int出错

C#将字符串转换为int出错,c#,string,int,converter,C#,String,Int,Converter,我有一个字符串,其中包含数字,如下所示: 现在我想得到位置2上的数字为整数,我喜欢这样: int number = Convert.ToInt32(keyCode[1]); 但是我得到的不是2,而是50 我做错了什么?你需要 int number = (int)Char.GetNumericValue(keyCode[1]); 需要强制转换,因为返回双精度 50是字符“2”的ascii码。0->48,1->49等 你能行 int number = keyCode[1]-'0'; 你得到了

我有一个
字符串
,其中包含数字,如下所示:

现在我想得到位置2上的数字为
整数
,我喜欢这样:

int number = Convert.ToInt32(keyCode[1]);
但是我得到的不是
2
,而是
50

我做错了什么?

你需要

int number = (int)Char.GetNumericValue(keyCode[1]);

需要强制转换,因为返回双精度

50是字符“2”的ascii码。0->48,1->49等

你能行

int number = keyCode[1]-'0';

你得到了50,因为它是
2
的ascii码

您得到它是因为您指向一个
char
,当c#将
char
转换为
int
时,它会返回其ascii代码。您应该改为使用
int.Parse
,它接受
字符串

int.Parse(keyCode[1].ToString());


您观察到,当您执行
intn=Convert.ToInt32('2')你得到
50
。没错

显然,您没有期望得到
50
,而是期望得到
2
。这是不正确的期望

期望
Convert.ToInt32('2')
将为您提供
2
,这是不正确的,因为如果您执行
Convert.ToInt32('A')
,您会期望什么

字符不是数字。当然,在计算机内部,一切都是用数字来表示的。所以,有一个映射告诉我们用什么数字来表示每个字符。Unicode就是这样一种映射,ASCII是您可能听说过的另一种映射。这些映射规定字符
'2'
对应于数字
50
,正如它们规定字符
'A'
对应于数字
65

Convert.ToInt32(char c)
执行一个非常基本的转换,它本质上将字符重新解释为一个数字,因此它允许您查看字符对应的数字。但是如果你想从
'2'
中得到
2
,那不是你想要的转换


相反,您需要更复杂的转换,如下所示:
intn=Int32.Parse(keyCode.SubString(1,1))

正如Ofir所说,另一种方法是
int number=int.Parse(keyCode[1].ToString())

这个命令可以这样解释:
int
Int32
的缩写,它包含一个
Parse(string)
方法
Parse
仅在输入为仅包含数字的字符串时才起作用,因此除非调用了
TryParse
(检查是否可以解析字符串的方法)并返回
true
,否则它并不总是最好的使用方法,但在这种情况下,由于输入字符串始终是数字,您可以使用
Parse
,而无需先使用
TryParse
keyCode[1]
实际上首先隐式地将keyCode转换为
char[]
,这样它就可以检索特定的索引,这就是为什么在解析它之前需要对其调用
ToString()


这是我个人最喜欢的将
字符串
字符
转换为
int
的方法,因为一旦理解了显式和隐式执行的转换,就很容易理解。如果要转换的字符串不是静态的,那么最好使用另一种方法,因为检查它是否可以被解析的
If
语句或
try
会使编码和执行比其他解决方案花费更长的时间。

我想使用keycode.Substring(1,1)代替keycode[1]。如中所述,转换为32(字符)
将指定Unicode字符的值转换为等效的32位带符号整数。
int.Parse(keyCode[1].ToString());
int.Parse(keyCode.Substring(1,1));