我在c#中有一个char:

char foo = '2';

现在我想把2变成一个整型。我发现皈依。ToInt32返回该字符的实际十进制值,而不是数字2。以下是可行的方法:

int bar = Convert.ToInt32(new string(foo, 1));

int。解析也只适用于字符串。

c#中没有本地函数可以在不使其成为字符串的情况下从char转换为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;
}

其他回答

首先将字符转换为字符串,然后转换为整数。

var character = '1';
var integerValue = int.Parse(character.ToString());

有趣的答案,但医生说的不一样:

使用GetNumericValue方法 转换表示的Char对象 数值类型的数字。使用 和TryParse来转换 字符串中的字符转换为Char类型 对象。使用ToString转换Char类型 object转换为String对象。

http://msdn.microsoft.com/en-us/library/system.char.aspx

这招对我很管用:

int bar = int.Parse("" + foo);

有人考虑过像这样使用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
}

这样更安全,更不容易出错

当字符不是ASCII数字时,基于结果的一些方法的比较:

char c1 = (char)('0' - 1), c2 = (char)('9' + 1); 

Debug.Print($"{c1 & 15}, {c2 & 15}");                                   // 15, 10
Debug.Print($"{c1 ^ '0'}, {c2 ^ '0'}");                                 // 31, 10
Debug.Print($"{c1 - '0'}, {c2 - '0'}");                                 // -1, 10
Debug.Print($"{(uint)c1 - '0'}, {(uint)c2 - '0'}");                     // 4294967295, 10
Debug.Print($"{char.GetNumericValue(c1)}, {char.GetNumericValue(c2)}"); // -1, -1