130

What is the proper way to convert a char to int? This gives 49:

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

I don't want to convert to string and then parse it.

gotqn
  • 42,737
  • 46
  • 157
  • 243
tvr
  • 4,455
  • 9
  • 24
  • 29

11 Answers11

298

I'm surprised nobody has mentioned the static method built right into System.Char...

int val = (int)Char.GetNumericValue('8');
// val == 8
Joel Mueller
  • 28,324
  • 9
  • 63
  • 88
40

how about (for char c)

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

which does substraction of the char value?

Re the API question (comments), perhaps an extension method?

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

then use int x = c.ParseInt32();

Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
21

What everyone is forgeting is explaining WHY this happens.

A Char, is basically an integer, but with a pointer in the ASCII table. All characters have a corresponding integer value as you can clearly see when trying to parse it.

Pranay has clearly a different character set, thats why HIS code doesnt work. the only way is

int val = '1' - '0';

because this looks up the integer value in the table of '0' which is then the 'base value' subtracting your number in char format from this will give you the original number.

Stefanvds
  • 5,868
  • 5
  • 48
  • 72
16
int i = (int)char.GetNumericValue(c);

Yet another option:

int i = c & 0x0f;

This should accomplish this as well.

Grif
  • 666
  • 5
  • 5
4
int val = '1' - '0';

This can be done using ascii codes where '0' is the lowest and the number characters count up from there

Tristan
  • 3,845
  • 5
  • 35
  • 58
3
int val = '1' - 48;
x2.
  • 9,554
  • 6
  • 41
  • 62
3

You may use the following extension method:

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';
        }
    }
Eugene Cheverda
  • 8,760
  • 2
  • 33
  • 18
  • 1
    @0xA3 The range check has to be at the beginning of the method in general. Semantically if we are to convert `char` to `int` we have to check range of the input parameter, not the output `int` value. – Eugene Cheverda Sep 08 '10 at 11:04
  • There is no need to check result `int` value because the range of numeric chars was performed at the start of the method, so there will be correct resulting value, if specified char is not in the range of numeric chars there will be thrown exception. The same logic as you provided but range check is performed at the beginning of the method. – Eugene Cheverda Sep 08 '10 at 12:09
  • Sorry, I was misreading your code sample. Sometimes it's hard to see the most obvious things. I'd bet that the code said `if (c < 0 || c > 9)`... – Dirk Vollmar Sep 08 '10 at 13:03
1

The most secure way to accomplish this is using Int32.TryParse method. See here: http://dotnetperls.com/int-tryparse

MUG4N
  • 19,377
  • 11
  • 56
  • 83
1
int val = '1' & 15;

The binary of the ASCII charecters 0-9 is:

0   -   00110000

1   -   00110001

2   -   00110010

3   -   00110011

4   -   00110100

5   -   00110101

6   -   00110110

7   -   00110111

8   -   00111000

9   -   00111001

and if you take in each one of them the first 4 LSB(using bitwise AND with 8'b00001111 that equels to 15) you get the actual number (0000 = 0,0001=1,0010=2,... )

Tomer Wolberg
  • 1,256
  • 10
  • 22
  • How does this work in terms of types? you are using a bitwise operator between a char and an int and then returns an int? Does the logical AND uses the binary representation of both the char and the int and return a binary representation and then as you are defining the var as an int it uses that representation? – mitomed Jun 07 '18 at 21:59
  • @mitnomed yes and if you use byte for example then it uses the byte representation. – Tomer Wolberg Jun 10 '18 at 08:00
0

An extension of some other answers that covers hexadecimal representation:

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;
}
Lauren Rutledge
  • 1,195
  • 5
  • 18
  • 27
Olek
  • 676
  • 7
  • 11
0

You can try something like this:

int val = Convert.ToInt32("" + '1');
briba
  • 2,857
  • 2
  • 31
  • 59