在C#中将char转换为int

Kei*_*thA 129 c# int char

我在c#中有一个char:

char foo = '2';
Run Code Online (Sandbox Code Playgroud)

现在我想把2变成一个int.我发现Convert.ToInt32返回char的实际十进制值而不是数字2.以下将起作用:

int bar = Convert.ToInt32(new string(foo, 1));
Run Code Online (Sandbox Code Playgroud)

int.parse也适用于字符串.

C#中没有本地函数从char到int而不是字符串吗?我知道这是微不足道的,但似乎很奇怪,直接进行转换没有任何原生的东西.

Jer*_*ten 147

这会将它转换为int:

char foo = '2';
int bar = foo - '0';
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为每个字符在内部由数字表示.字符"0"到"9"由连续数字表示,因此找到字符"0"和"2"之间的差异会得到数字2.

  • @EricSchaefer但是在C#中这是一个安全的假设:`char`总是UTF-16. (7认同)
  • 不,它没有,只要数字是有序的(编译器需要charset)它将工作,无论它们开始的价值. (6认同)
  • Downvoting因为我只能看到机制,而不是意图. (4认同)
  • 它假定某个字符集. (4认同)
  • @svick 现在已经很老了,但是自从您发布这篇文章以来,我们已经推出了使用 UTF-8 的 Core。不过,这仍然是一个安全的假设。 (4认同)
  • 不错的小小黑客! (3认同)
  • 这很好,除了你仍然需要先进行边界检查,此时我不确定int.parse(foo.ToString())是否更快. (2认同)
  • @JoelCoehoorn 这不是真的,.Net Core 中的 `char` 仍然是 UTF-16。[正在努力在 .Net Core 的未来版本中添加 UTF-8 字符串](https://github.com/dotnet/corefx/issues/30503),但即使这样也不会改变 `char`。 (2认同)
  • 哇...最令人印象深刻。而且我一整天都在处理字符集,大量转换为 int/uint 十进制(即数字)值,大于/小于比较等,但从未想过这种简单但绝妙的方法。 (2认同)
  • `char foo = 'a'; int bar = foo - '0';` -> `bar == 49`,这可能不是您想要的。之后您需要检查“0 <= bar <= 9”。 (2认同)
  • 警告:这是一个非标准解决方案。它不适用于本地化数字(如阿拉伯数字)。这就是为什么它只适用于 ASCII。 (2认同)

Cha*_*ant 122

有趣的答案,但文档说不同:

使用这些GetNumericValue方法将Char表示数字的对象转换为数值类型.使用 ParseTryParse将字符串中的字符转换为Char 对象.使用ToString一个转换Char 对象的String对象.

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

  • @KeithA:它有一个原因让它返回double:`char.GetNumericValue('¼')`产生0.25.Unicode的乐趣...... ;-) (81认同)
  • 这不是回答实际问题的答案,Char.GetNumericValue('o')、Char.GetNumericValue('w') 和任何非数字字符都将始终返回 -1 - Jeremy Ruten 已发布正确答案 (4认同)
  • 啊!所以有一些本土的东西!奇怪的是它返回一个双精度。我更喜欢这个答案。感谢您指出。 (2认同)
  • @RustyNail在原始问题的情况下 - 具体询问他在哪里知道char代表一个数字 - *这*是正确的答案 (2认同)
  • @mmcrae我不这么认为 - 最初的问题要求将“char”转换为“int”,而不首先使用“string”。 (2认同)

fau*_*lty 73

有没有人考虑使用int.Parse()int.TryParse()喜欢这个

int bar = int.Parse(foo.ToString());
Run Code Online (Sandbox Code Playgroud)

甚至更好

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}
Run Code Online (Sandbox Code Playgroud)

它更安全,更不容易出错

  • @logout不,它是StackOverflow上的答案如何促进膨胀软件的一个例子.这实际上是不必要的膨胀,我不明白为什么这被认为优于从char中减去''0'. (5认同)
  • 绝对正确的方法。如果要抛出非整数输入,请选择第一个;如果要执行其他操作,请选择第二个。 (2认同)

son*_*tek 27

char c = '1';
int i = (int)(c-'0');
Run Code Online (Sandbox Code Playgroud)

你可以用它创建一个静态方法:

static int ToInt(this char c)
{
    return (int)(c - '0');
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在寻找的。您也许可以解释一下您在用负零部分做什么。 (2认同)

Rol*_*sta 8

试试这个

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

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
Run Code Online (Sandbox Code Playgroud)


Nik*_*lay 7

默认情况下你使用UNICODE所以我建议使用faulty的方法

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

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


Dan*_*man 7

这将转换为整数并处理 unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

您可以在此处阅读更多内容。


Tom*_*erg 6

原则:

char foo = '2';
int bar = foo & 15;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果你把它们中的每一个都取前 4 个 LSB(使用按位 AND 和 8'b00001111 等于 15)你得到实际数字(0000 = 0,0001=1,0010=2,...)

用法:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可能是解决方案,但 [包括解释](//meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。 (3认同)

小智 6

真正的方法是:

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

"theNameOfYourInt" - 您希望将字符转换为的 int。

"theNameOfYourChar" - 您要使用的 Char,以便将其转换为 int。

留下一切。


Ham*_*RIM 6

我同意@Chad Grant

如果您转换为字符串也是正确的,那么您可以将该值用作问题中所说的数字

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
Run Code Online (Sandbox Code Playgroud)

我试图创建一个更简单易懂的例子

char v = '1';
int vv = (int)char.GetNumericValue(v); 
Run Code Online (Sandbox Code Playgroud)

char.GetNumericValue(v) 返回双精度值并转换为 (int)

更高级的数组用法

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
Run Code Online (Sandbox Code Playgroud)