在C#中将char转换为int

231

我在c#中有一个字符:

char foo = '2';

现在我想将2转换为int类型。我发现Convert.ToInt32返回的是字符的实际十进制值而不是数字2。下面的代码可以解决:

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

int.parse仅适用于字符串。

在C#中,没有原生函数可以将char转换为int而无需将其转换为字符串。我知道这很微不足道,但似乎奇怪的是没有直接进行转换的本地方法。

20个回答

267

这将把它转换为一个int

char foo = '2';
int bar = foo - '0';

这是因为每个字符都有一个内部表示的数字。字符 '0''9' 由连续的数字表示,所以计算字符 '0''2' 之间的差值得到数字 2。


7
它假设了一定的字符集。 - EricSchaefer
13
只要数字按顺序排列(编译器要求字符集遵循此规则),它就能正常工作,不管它们从什么值开始。 - Paige Ruten
3
除了您仍然需要先进行边界检查之外,这是没问题的。此时我不确定int.parse(foo.ToString())是否更快。 - Matthew Flaschen
12
在C#中,认为char类型始终是UTF-16是一种安全的假设。 - svick
6
自从您发布这篇文章以来,时间已经过去了,现在我们有了使用UTF-8的Core版本,虽然前面提到的仍然是一个安全假设。 - Joel Coehoorn
显示剩余6条评论

218

回答很有趣,但是文档说得不同:

使用GetNumericValue方法将表示数字的Char对象转换为数值类型。 使用ParseTryParse将字符串中的字符转换为Char对象。 使用ToStringChar对象转换为String对象。

http://msdn.microsoft.com/zh-cn/library/system.char.aspx


2
啊!原来有本地方法可用啊!返回一个double类型有点奇怪。我更喜欢这个答案。感谢你指出来。 - KeithA
130
@KeithA: 它返回双精度浮点数的原因是:char.GetNumericValue('¼') 返回0.25。Unicode的乐趣...;-) - Heinzi
4
这不是一个真正回答问题的答案,Char.GetNumericValue('o')、Char.GetNumericValue('w')和任何非数字字符都将返回-1 - Jeremy Ruten已经发布了正确的答案。 - Rusty Nail
7
在原问题中,特别询问他从何知道该字符代表数字的情况下,这个答案是正确的。 - Don Cheadle
2
@mmcrae 我不这么认为 - 原问题要求在不使用string的情况下将char转换为int - NetMage
显示剩余3条评论

113

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

它更安全,错误率更低。


5
完全正确的方法。如果希望非整数输入抛出异常,请选择第一个选项;如果想要执行其他操作,请选择第二个选项。 - Jay Bazuzi
1
这是一种通用转换方法的好方法。顺便说一句,这是 .NET 如何推广膨胀软件的另一个例子。(我的意思是继续对 TryParse() 和 ToString() 进行单元测试 - 你不能,不切实际)。 - logout
7
@logout 不,这是一个 StackOverflow 上一个回答如何推广充斥着无用功能软件的示例。这确实是不必要的臃肿,并且我不明白为什么这被认为比从 char 中减去“0”更好。 - Roman Starkov
1
@RomanStarkov 这样阅读起来要容易得多!为什么不能有一个解析方法,将这些神奇的字符减法隐藏起来呢? - sigma
@sigma,没错,如果这个减法是神奇的,那么你想要隐藏它是可以理解的。但是你只是隐藏了一个“减法”!!!对我来说,这有点像DivideApplesBetweenPeople(people: 3, apples: 15),即使这个数学问题很简单,也把所有的“神奇数学”都隐藏起来了。 - Roman Starkov

31
char c = '1';
int i = (int)(c - '0');

你可以将其创建为静态方法:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

2
这就是我一直在寻找的。也许你可以解释一下你在处理负零部分时做了什么。 - Xonatron

18

试一试

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

1
你的注释写着'9',但是你的代码中是9,这样无法编译。 - svick

10

默认情况下,您使用UNICODE,因此我建议使用faulty的方法。

int bar = int.Parse(foo.ToString());

即使数字值下面的数字和基本拉丁字符相同。


8

此代码将字符转换为整数,同时处理Unicode编码。

CharUnicodeInfo.GetDecimalDigitValue('2')

您可以在这里阅读更多信息。


8

正确的方法是:

int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);

"theNameOfYourInt" - 您想要将字符转换为整数的整数。

"theNameOfYourChar" - 您想要使用的字符,以便将其转换为整数。

保留其他所有内容不变。


7

原则:

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;
}

3
这段代码片段可能是解决方案,但附加一个解释真的有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您提供代码建议的原因。 - yivi

6

我同意@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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接