web-dev-qa-db-fra.com

Comment convertir char en int?

Quelle est la bonne façon de convertir une char en int? Cela donne 49:

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

Je ne veux pas convertir en chaîne et ensuite l'analyser.

118
tvr

Je suis surpris que personne n'ait mentionné la méthode statique intégrée à System.Char...

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

que diriez-vous (pour char c)

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

qui fait la soustraction de la valeur char?

Re la question API (commentaires), peut-être une méthode d'extension?

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

puis utilisez int x = c.ParseInt32();

38
Marc Gravell

Ce que tout le monde oublie, c'est d'expliquer POURQUOI cela se produit. 

Un caractère est fondamentalement un entier, mais avec un pointeur dans la table ASCII. Tous les caractères ont une valeur entière correspondante, comme vous pouvez le voir clairement lorsque vous essayez de l'analyser. 

Pranay a clairement un jeu de caractères différent, c’est pourquoi son code ne fonctionne pas. le seul moyen est 

int val = '1' - '0';

parce que cela cherche la valeur entière dans la table de '0' qui est alors la «valeur de base» soustrayant votre nombre au format char, ceci vous donnera le nombre original.

19
Stefanvds
int i = (int)char.GetNumericValue(c);

Encore une autre option:

int i = c & 0x0f;

Cela devrait accomplir cela aussi.

15
Grif
int val = '1' - '0';

Cela peut être fait en utilisant des codes ASCII où '0' est le plus bas et le nombre de caractères compte

3
Tristan
int val = '1' - 48;
3
x2.

Vous pouvez utiliser la méthode d'extension suivante:

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';
        }
    }
3
Eugene Cheverda

Le moyen le plus sûr d’y parvenir est d’utiliser la méthode Int32.TryParse. Voir ici: http://dotnetperls.com/int-tryparse

1
MUG4N

Vous pouvez essayer quelque chose comme ça:

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

Une extension de quelques autres réponses qui couvre la représentation hexadécimale:

     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
Oleksandr Lytvyn
int val = '1' & 15;

Le binaire des caractères ASCII - 0-9 est:

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

et si vous prenez dans chacun d'eux les 4 premiers LSB (en utilisant AND au niveau du bit avec 8'b00001111 qui équivaut à 15), vous obtenez le nombre réel (0000 = 0,0001 = 1,0010 = 2, ...)

0
Tomer Wolberg