题
我在c#中有一个字符:
char foo = '2';
现在我想把2变成一个int。我发现Convert.ToInt32返回char的实际十进制值而不是数字2.以下将起作用:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse也适用于字符串。
C#中没有本机函数可以从char转到int而不使其成为字符串吗?我知道这是微不足道的,但似乎很奇怪,直接进行转换没有任何原生的东西。
解决方案
有趣的答案,但文档说的不同:
使用
GetNumericValue
方法 转换代表的Char
对象 一个数字到数值类型。使用Parse
和TryParse
转换一个 将字符串中的字符转换为Char
宾语。使用ToString
转换Char
对象为String
对象。
其他提示
这会将其转换为int:
char foo = '2';
int bar = foo - '0';
这是有效的,因为每个字符在内部由数字表示。字符“0”到“9”由连续的数字表示,因此找到字符“0”和“2”之间的差异会得到数字2.
是否有人考虑过使用 int.Parse()
和 int.TryParse()
这样
int bar = int.Parse(foo.ToString());
更像这样
int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
//Do something to correct the problem
}
它更安全,更不容易出错
char c = '1';
int i = (int)(c-'0');
你可以用它创建一个静态方法:
static int ToInt(this char c)
{
return (int)(c - '0');
}
试试这个
char x = '9'; // '9' = ASCII 57
int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
默认情况下你使用UNICODE所以我建议使用错误的方法
int bar = int.Parse(foo.ToString());
即使数字和基本拉丁字符下面的数字值相同。
真正的方法是:
int theNameOfYourInt =(int).Char.GetNumericValue(theNameOfYourChar);
" theNameOfYourInt" - 你希望你的char被转换为的int。
" theNameOfYourChar" - 你想要使用的字符,因此它将被转换为int。
保留其他所有内容。
<强>原理:强>
char foo = '2';
int bar = foo & 15;
ASCII字符0-9的二进制文件是:
0 - 0011 0000
1 - 0011 0001
2 - 0011 0010
3 - 0011 0011
4 - 0011 0100
5 - 0011 0101
6 - 0011 0110
7 - 0011 0111
8 - 0011 1000
9 - 0011 1001
如果你把它们中的每一个接收到前4个LSB(使用按位AND和8'b00001111等于15)你得到实际数字(0000 = 0,0001 = 1,0010 = 2,... )
<强>用法:强>
public static int CharToInt(char c)
{
return 0b0000_1111 & (byte) c;
}
当字符不是ASCII数字时,基于结果的一些方法的比较:
char c = '\n';
Debug.Print(<*>quot;{c & 15}"); // 10
Debug.Print(<*>quot;{c ^ 48}"); // 58
Debug.Print(<*>quot;{c - 48}"); // -38
Debug.Print(<*>quot;{(uint)c - 48}"); // 4294967258
Debug.Print(<*>quot;{char.GetNumericValue(c)}"); // -1
我正在使用Compact Framework 3.5,而没有“char.Parse”。方法。 我认为使用Convert类也不错。 (参见CLR通过C#,Jeffrey Richter)
char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);
使用ASCII char或Unicode char
我同意@Chad Grant
如果转换为字符串也是正确的,那么您可以将该值用作问题中所述的数字
int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
我试图创建一个更简单易懂的例子
char v = '1';
int vv = (int)char.GetNumericValue(v);
char.GetNumericValue(v)返回double并转换为(int)
更多Advenced用作数组
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
我见过很多答案,但他们似乎对我很困惑。我们不能只是简单地使用Type Casting。
例如: -
int s;
char i= '2';
s = (int) i;
这对我有用:
int bar = int.Parse("" + foo);