怎么把char转换成int?


123

什么是一个转换的正确方法charint?这给出了49

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

我不想转换为字符串然后解析它。


1
问题可能重复。
RBT

Answers:


282

我很惊讶没有人提到内置于System.Char... 的静态方法

int val = (int)Char.GetNumericValue('8');
// val == 8

18
好地方!+1非常奇怪double,尽管它返回了一个
Marc Gravell

4
我同意,我不知道为什么它会返回“双精度”-一个字符怎么可能代表一个浮点数?
乔尔·穆勒

49
有许多Unicode字符确实表示一个非整数,例如U + 2153
dtb

26
@dtb-我没考虑过。Char.GetNumericValue('⅓')确实返回0.3333...。感谢您指出了这一点!
乔尔·穆勒

1
脚注:此功能目前在NetMF中不可用。
GisMofx

40

怎么样(对char c

int i = (int)(c - '0');

减去char值是什么?

是API问题(注释),还是扩展方法?

public static class CharExtensions {
    public static int ParseInt32(this char value) {
        int i = (int)(value - '0');
        if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
        return i;
    }
}

然后使用 int x = c.ParseInt32();


1
我应该提到,我知道这一点,但是还有其他方法吗?我想知道是否有API可以做到这一点?
TVR

4
如果您希望行为类似int.Parse,即在无效输入上引发异常,则需要添加其他边界检查:if (i < 0 || i > 9) throw new FormatException();
Dirk Vollmar 2010年

@ user386338恐怕没有。
尤金·谢韦达

@ user386338 -更新了一个选项重新API,另外还包括@ 0xA3执行的反馈
马克·Gravell

@ user386338-有关内置API方法的信息,请参见Joel的答案
Marc Gravell

21

每个人都忘记的是在解释为什么会这样。

一个Char,基本上是一个整数,但是在ASCII表中有一个指针。所有字符都有一个对应的整数值,您在尝试解析它时可以清楚地看到。

Pranay显然具有不同的字符集,这就是为什么HIS代码不起作用的原因。唯一的方法是

int val = '1' - '0';

因为这会在表格中查找整数值,'0'然后从中减去基数格式的数字作为“基值”即可得到原始数字。


15
int i = (int)char.GetNumericValue(c);

另一个选择:

int i = c & 0x0f;

这也应该完成。


4
int val = '1' - '0';

可以使用ascii代码来完成,其中“ 0”是最低的,并且数字字符从那里开始递增计数


这太棒了!imo这里最优雅的解决方案。
arabisoft

3
int val = '1' - 48;

@Luke Xu:“ 0”具有ASCII码0x30(十进制为48),因此与“ 1”-“ 0”相同
NiKiZe

3

您可以使用以下扩展方法:

public static class CharExtensions
    {
        public static int CharToInt(this char c)
        {
            if (c < '0' || c > '9')
                throw new ArgumentException("The character should be a number", "c");

            return c - '0';
        }
    }

1
@ 0xA3通常,范围检查必须在方法的开头。语义上,如果要转换char为,int我们必须检查输入参数的范围,而不是输出int值。
尤金·谢韦达

不需要检查结果int值,因为数字字符的范围是在方法开始时执行的,因此将有正确的结果值,如果指定的字符不在数字字符的范围内,则会引发异常。与您提供的逻辑相同,但是在方法开始时执行范围检查。
尤金·谢韦达

抱歉,我误读了您的代码示例。有时很难看到最明显的东西。我敢打赌,代码说的是if (c < 0 || c > 9)……
Dirk Vollmar 2010年

1

实现此目的的最安全方法是使用Int32.TryParse方法。看到这里:http : //dotnetperls.com/int-tryparse


TryParse适用于字符串,而不适用于字符
TVR 2010年

是的,它仍然是完成转换的最安全的方式
MUG4N

1
将单个字符转换为整数是否安全?
乔尔·穆勒

1
在这种情况下,“安全”意味着如果您的字符实际上不是ascii数字,它不会引起问题-它可以是多字节的unicode字符。
罗宾·贝内特

1
int val = '1' & 15;

ASCII字符0-9的二进制为:

0-00110000

1-00110001

2-00110010

3-00110011

4-00110100

5-00110101

6-00110110

7-00110111

8-00111000

9-00111001

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


在类型方面这是如何工作的?您在char和int之间使用按位运算符,然后返回int?逻辑AND是否使用char和int的二进制表示形式并返回二进制表示形式,然后在将var定义为int时,它使用该表示形式?
模仿

@mitnomed是,如果您使用字节,则使用字节表示。
Tomer Wolberg

0

您可以尝试如下操作:

int val = Convert.ToInt32("" + '1');

为什么不只是.ToString()?
Veikedo '16

@Veikedo他想要一个int,而不是一个字符串。
briba '16

6
我的意思是Convert.ToInt32('1'.ToString())
Veikedo

0

其他一些答案的扩展,涵盖了十六进制表示形式:

public int CharToInt(char c) 
{
    if (c >= '0' && c <= '9') 
    {
        return c - '0';
    }
    else if (c >= 'a' && c <= 'f') 
    {
        return 10 + c - 'a';
    }
    else if (c >= 'A' && c <= 'F') 
    {
        return 10 + c - 'A';
    }

    return -1;
}
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.