128 votes

Comment convertir un char en int ?

Quelle est la bonne façon de convertir un char a 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.

1 votes

Duplicata possible de este question.

0 votes

Duplicata possible de Convertir un char en int en C#

290voto

Joel Mueller Points 14985

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

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

19 votes

Bon point ! +1 Très étrange que cela renvoie un double mais

4 votes

Je suis d'accord, je n'arrive pas à comprendre pourquoi il renvoie 'double' - comment un seul caractère peut-il représenter un nombre à virgule flottante ?

49 votes

Il existe de nombreux caractères Unicode qui représentent effectivement un nombre non entier, par exemple, U+2153 .

40voto

Marc Gravell Points 482669

Et si (pour char c )

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

qui effectue la soustraction de la valeur du caractère ?

Concernant la question de l'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 utiliser int x = c.ParseInt32();

1 votes

J'aurais dû préciser que je connaissais cette possibilité, mais existe-t-il un autre moyen ? Je voulais savoir s'il existe une API pour faire cela ?

4 votes

Si vous voulez un comportement similaire à celui de int.Parse Si l'on veut qu'une exception soit levée en cas d'entrée non valide, il faut ajouter une vérification supplémentaire des limites : if (i < 0 || i > 9) throw new FormatException();

0 votes

@user386338 J'ai bien peur qu'il n'y en ait pas.

21voto

Stefanvds Points 3659

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

Un Char, c'est en fait 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 en essayant de les analyser.

Pranay a clairement un jeu de caractères différent, c'est pourquoi SON code ne fonctionne pas. la seule solution est

int val = '1' - '0';

parce que cela recherche la valeur entière dans la table de '0' qui est alors la "valeur de base". en soustrayant votre nombre au format char de celui-ci, vous obtiendrez le nombre original.

16voto

Grif Points 216
int i = (int)char.GetNumericValue(c);

Une autre option encore :

int i = c & 0x0f;

Cela devrait également permettre d'y parvenir.

4voto

Tristan Points 1542
int val = '1' - '0';

Cela peut être fait en utilisant des codes ascii où '0' est le plus petit et le nombre de caractères augmente à partir de là.

0 votes

C'est brillant ! C'est la solution la plus élégante ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X