在C#中将char转换为int


148

我在C#中有一个字符:

char foo = '2';

现在,我想将2转换为int。我发现Convert.ToInt32返回char的实际十进制值,而不是数字2。以下将起作用:

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

int.parse也仅适用于字符串。

在C#中,没有将本机函数从char转换为int而不将其设置为字符串的功能吗?我知道这是微不足道的,但是奇怪的是,没有任何原生工具可以直接进行转换。

Answers:


143

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

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

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


啊!所以有些本机!奇怪的是,它返回一个双精度值。我更喜欢这个答案。感谢您指出。
KeithA

92
@KeithA:有一个原因使其返回double:char.GetNumericValue('¼')产生0.25。Unicode的乐趣... ;-)
Heinzi 2012年

1
这不是回答实际问题Char.GetNumericValue('o'),Char.GetNumericValue('w')的答案,任何非数字char都将始终返回-1-Jeremy Ruten已发布了正确答案
Rusty Nail

2
@RustyNail在原始问题的情况下-特别询问他在哪里知道字符代表数字- 是正确的答案
Don Cheadle

@mmcrae我不这么认为-原来问题问charint,而无需使用string第一。
NetMage

163

这会将其转换为一个int:

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

之所以可行,是因为每个字符在内部都由数字表示。字符“ 0”到“ 9”由连续的数字表示,因此找到字符“ 0”和“ 2”之间的差将得出数字2。


5
它假定某个字符集。
EricSchaefer,

8
不,不是这样,只要数字按顺序排列(编译器需要使用字符集),无论它们以什么值开头,它都可以工作。
杰里米·鲁滕

2
这很好,除了您仍然需要先进行边界检查,并且在那时我不确定int.parse(foo.ToString())是否更快。
马修·弗莱申

7
@EricSchaefer但这在C#中char是一个安全的假设:始终为UTF-16。
svick

2
@svick现在有点旧了,但是自从您发布此内容以来,我们已经推出了使用UTF-8的Core。不过,这仍然是一个安全的假设。
Joel Coehoorn

84

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

更安全,更不易出错


2
绝对正确的方法。如果要抛出非整数输入,请选择第一个;如果要执行其他操作,请选择第二个。
杰伊·巴祖兹

对于通用转换方法来说,这是一个很好的方法。顺便说一句,它是.NET如何推广过时软件的另一个示例。(我的意思是继续对TryParse()和ToString()进行单元测试-实际上,您不能这样做)。
注销

5
@logout不,这是StackOverflow上的答案如何促进过时软件的示例。这确实是不必要的肿,而且我不明白为什么这被认为比'0'从char中减去更好。
罗曼·斯塔科夫

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

您可以从中创建一个静态方法:

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

这就是我想要的。您也许可以解释零负部分在做什么。
Xonatron '18年

10

试试这个

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

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

您的注释为'9',但您的代码包含9,无法编译。
svick

7

默认情况下,您使用UNICODE,所以我建议使用Faulty的方法

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

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




2

原理:

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(使用按位与且8'b00001111等于15),则会得到实际数字(0000 = 0,0001 = 1,0010 = 2,...)

用法:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
尽管此代码段可能是解决方案,但包括说明确实有助于提高帖子的质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
yivi

2

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

0

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

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

我正在使用Compact Framework 3.5,并且没有“ char.Parse”方法。我认为使用Convert类还不错。(请参阅通过C#的CLR,Jeffrey Richter)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

与ASCII字符或Unicode字符一起使用



-5

我看到了很多答案,但它们似乎使我感到困惑。我们不能仅仅使用类型转换。

例如:

int s;
char i= '2';
s = (int) i;

1
这将返回字符2的ASCII码,而不是值
2。– cavpollo

然后如何使用char.GetNumericValue(它返回一个双精度值)并将其强制转换为int。
学习者

是的,这就是@Chad Grant接受的答案所提出的问题
cavpollo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.