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