我在c#中有一个char:
char foo = '2';
现在我想把2变成一个整型。我发现皈依。ToInt32返回该字符的实际十进制值,而不是数字2。以下是可行的方法:
int bar = Convert.ToInt32(new string(foo, 1));
int。解析也只适用于字符串。
c#中没有本地函数可以在不使其成为字符串的情况下从char转换为int吗?我知道这是微不足道的,但这似乎很奇怪,没有本地直接进行转换。
我在c#中有一个char:
char foo = '2';
现在我想把2变成一个整型。我发现皈依。ToInt32返回该字符的实际十进制值,而不是数字2。以下是可行的方法:
int bar = Convert.ToInt32(new string(foo, 1));
int。解析也只适用于字符串。
c#中没有本地函数可以在不使其成为字符串的情况下从char转换为int吗?我知道这是微不足道的,但这似乎很奇怪,没有本地直接进行转换。
当前回答
我搜索了最优化的方法,并非常惊讶地发现,最好的方法是最简单的(也是最流行的答案):
public static int ToIntT(this char c) =>
c is >= '0' and <= '9'?
c-'0' : -1;
下面是我尝试过的一些方法:
c-'0' //current
switch //about 25% slower, no method with disabled isnum check (it is but performance is same as with enabled)
0b0000_1111 & (byte) c; //same speed
Uri.FromHex(c) /*2 times slower; about 20% slower if use my isnum check*/ (c is >= '0' and <= '9') /*instead of*/ Uri.IsHexDigit(testChar)
(int)char.GetNumericValue(c); // about 20% slower. I expected it will be much more slower.
Convert.ToInt32(new string(c, 1)) //3-4 times slower
请注意,isnum检查(第一个代码块中的第二行)占用了大约30%的性能,所以如果您确定c是char,则应该取消它。测试误差为~5%
其他回答
原则:
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;
}
有一个非常简单的方法可以将字符0-9转换为整数: c#像对待整数一样对待char值。
Char c = '7';(ascii码55)int x = c - 48;(result = integer of 7)
我搜索了最优化的方法,并非常惊讶地发现,最好的方法是最简单的(也是最流行的答案):
public static int ToIntT(this char c) =>
c is >= '0' and <= '9'?
c-'0' : -1;
下面是我尝试过的一些方法:
c-'0' //current
switch //about 25% slower, no method with disabled isnum check (it is but performance is same as with enabled)
0b0000_1111 & (byte) c; //same speed
Uri.FromHex(c) /*2 times slower; about 20% slower if use my isnum check*/ (c is >= '0' and <= '9') /*instead of*/ Uri.IsHexDigit(testChar)
(int)char.GetNumericValue(c); // about 20% slower. I expected it will be much more slower.
Convert.ToInt32(new string(c, 1)) //3-4 times slower
请注意,isnum检查(第一个代码块中的第二行)占用了大约30%的性能,所以如果您确定c是char,则应该取消它。测试误差为~5%
这招对我很管用:
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
}
这样更安全,更不容易出错