C# string 转 int 出错

C# converting string to int goes wrong

我有一个包含数字的 string,像这样:

string keyCode = "1200009990000000000990";

现在我想得到位置 2 上的数字 integer,我这样做是这样的:

int number = Convert.ToInt32(keyCode[1]);

但我得到的不是 2,而是 50

我做错了什么?

你需要

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

演员表是必需的,因为 Char.GetNumericValue returns 一个替身。

50 是 char '2' 的 ascii 码。 0->48, 1->49 等....

你可以做到

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

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

你得到它是因为你指向 char 并且当 c# 将 char 转换为 int 时它返回它的 ascii 代码。您应该使用 int.Parse 代替 string.

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

int.Parse(keyCode.Substring(1,1));

您观察到,当您执行 int n = 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,那不是你想要的转换。

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

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

这条命令可以这样解释:int是shorthand for Int32,其中包含一个Parse(string)方法。 Parse 仅在输入是仅包含数字的字符串时才有效,因此它并不总是最好使用,除非 TryParse(检查是否可以解析字符串的方法)已被调用并且returns true,但在这种情况下,由于您的输入字符串 总是 一个数字,您可以使用 Parse 而不用 TryParse第一的。 keyCode[1] 实际上首先将 keyCode 隐式转换为 char[],以便它可以检索特定索引,这就是为什么在解析它之前需要对其调用 ToString()

这是我个人最喜欢的将 stringchar 转换为 int 的方法,因为一旦您理解了两者执行的转换,就很容易理解显式和隐式。如果要转换的字符串不是静态的,最好使用不同的方法,因为 if 语句检查它是否可以被解析或 try 使得编码和执行时间比其他解决方案之一。