我在c#中有一个字符:
char foo = '2';
现在我想将2转换为int类型。我发现Convert.ToInt32返回的是字符的实际十进制值而不是数字2。下面的代码可以解决:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse仅适用于字符串。
在C#中,没有原生函数可以将char转换为int而无需将其转换为字符串。我知道这很微不足道,但似乎奇怪的是没有直接进行转换的本地方法。
这将把它转换为一个int
:
char foo = '2';
int bar = foo - '0';
这是因为每个字符都有一个内部表示的数字。字符 '0'
到 '9'
由连续的数字表示,所以计算字符 '0'
和 '2'
之间的差值得到数字 2。
回答很有趣,但是文档说得不同:
使用
GetNumericValue
方法将表示数字的Char
对象转换为数值类型。 使用Parse
和TryParse
将字符串中的字符转换为Char
对象。 使用ToString
将Char
对象转换为String
对象。
char.GetNumericValue('¼')
返回0.25。Unicode的乐趣...;-) - Heinzistring
的情况下将char
转换为int
。 - NetMage有没有人考虑过像这样使用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
}
它更安全,错误率更低。
DivideApplesBetweenPeople(people: 3, apples: 15)
,即使这个数学问题很简单,也把所有的“神奇数学”都隐藏起来了。 - Roman Starkovchar 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
'9'
,但是你的代码中是9
,这样无法编译。 - svick默认情况下,您使用UNICODE,因此我建议使用faulty的方法。
int bar = int.Parse(foo.ToString());
即使数字值下面的数字和基本拉丁字符相同。
正确的方法是:
int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);
"theNameOfYourInt" - 您想要将字符转换为整数的整数。
"theNameOfYourChar" - 您想要使用的字符,以便将其转换为整数。
保留其他所有内容不变。
原则:
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
如果你将它们中的每一个都取前四个LSB(使用8'b00001111进行按位与运算,等于15),你将得到实际数字(0000 = 0,0001 = 1,0010 = 2,...)
用法:
public static int CharToInt(char c)
{
return 0b0000_1111 & (byte) c;
}
我同意@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)类型
更高级的用法是作为数组使用
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
char
类型始终是UTF-16是一种安全的假设。 - svick