2010-09-08 112 views
100

什么是将char转换为int的正确方法? 这给49如何将char转换为int?

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

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

+0

[此](https://stackoverflow.com/q/239103/465053)问题的可能的复制。 – RBT 2017-08-22 11:54:47

回答

236

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

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

好地方! +1非常奇怪,它返回一个'double',虽然 – 2010-09-08 09:16:39

+3

我同意,我不明白为什么它返回'双' - 单个字符如何可能表示一个浮点数? – 2010-09-08 16:25:10

+39

有许多Unicode字符代表非整数,例如[U + 2153](http://www.fileformat.info/info/unicode/char/2153/index.htm)。 – dtb 2010-09-13 12:24:54

37

约(用于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 2010-09-08 08:22:42

+4

如果你想要一个类似于'int.Parse'的行为,即在无效输入上抛出一个异常,你需要添加额外的边界检查:'if(i < 0 || i > 9)throw new FormatException();' – 2010-09-08 08:23:55

+0

@ user386338 I恐怕没有。 – 2010-09-08 08:25:30

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

这可以使用ASCII码,其中“0”是最低的字符数从那里

3
int val = '1' - 48; 
+0

为什么这个工作? – 2015-09-19 16:54:19

+0

@Luke Xu:'0'有ASCII代码0x30,它是十进制的48,所以这与'1'相同'0' – NiKiZe 2018-03-09 13:49:47

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'; 
     } 
    } 
+0

如果c ='x':)怎么办 – tvr 2010-09-08 08:40:48

+0

查看更新,对不起,我匆忙;) – 2010-09-08 09:05:09

+1

@ 0xA3范围检查一般在方法的开始。在语义上,如果我们要将'char'转换为'int',我们必须检查输入参数的范围,而不是输出'int'值。 – 2010-09-08 11:04:28

1

完成此操作的最安全方法是使用Int32.TryParse方法。看到这里: http://dotnetperls.com/int-tryparse

+0

TryParse适用于不适用于字符串的字符串 – tvr 2010-09-08 08:40:17

+0

是的,它是最安全的方式来完成转换 – MUG4N 2010-09-08 08:42:42

+1

将单个字符转换为整数是安全问题? – 2010-09-08 09:06:03

18

每个人都在伪造的是解释为什么发生这种情况。

一个字符,基本上是一个整数,但在ASCII表中有一个指针。所有字符都有相应的整数值,正如您在分析时可以清楚看到的那样。

Pranay显然有不同的字符集,这就是为什么他的代码不起作用。 唯一的办法就是

int val = '1' - '0'; 

,因为这会查找的'0'表中,然后将“基值” 从这个减去字符格式的数字会给你原来的号码的整数值。

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

还有另一个选择:

int i = c & 0x0f; 

这应该做到这一点。

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

你可以尝试这样的事情:

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

为什么不只是.ToString()? – Veikedo 2016-02-25 09:18:25

+0

@Veikedo他想要一个int,而不是一个字符串。 – Crasher 2016-04-28 14:15:11

+5

我的意思是'Convert.ToInt32('1'.ToString())' – Veikedo 2016-04-28 17:15:40

0
int val = '1' & 15; 

的ASCII charecters 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是equels 15)把你得到的实际数量(0000 = 0,0001 = 1,0010 = 2,...)