Convertir char en int en C #


149

J'ai un caractère en c #:

char foo = '2';

Maintenant, je veux mettre le 2 dans un int. Je trouve que Convert.ToInt32 renvoie la valeur décimale réelle du caractère et non le nombre 2. Ce qui suit fonctionnera:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse ne fonctionne également que sur les chaînes.

N'y a-t-il pas de fonction native en C # pour passer d'un caractère à un entier sans en faire une chaîne? Je sais que c'est trivial, mais il semble juste étrange qu'il n'y ait rien de natif pour effectuer directement la conversion.

Réponses:


144

Des réponses intéressantes mais les documents disent différemment:

Utilisez les GetNumericValueméthodes pour convertir un Charobjet qui représente un nombre en un type de valeur numérique. Utilisez Parseet TryParsepour convertir un caractère d'une chaîne en Char objet. Utilisez ToStringpour convertir un Char objet en Stringobjet.

http://msdn.microsoft.com/en-us/library/system.char.aspx


ahh! il y a donc quelque chose de natif! Bizarre qu'il renvoie un double. J'aime mieux cette réponse. Merci de l'avoir signalé.
KeithA

92
@KeithA: Il y a une raison pour qu'il retourne le double: char.GetNumericValue('¼')donne 0,25. The joys of Unicode ... ;-)
Heinzi

1
Ce n'est pas une réponse qui répond à la question réelle, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') et tout caractère non numérique renverra toujours -1 - Jeremy Ruten a publié la bonne réponse
Rusty Nail

2
@RustyNail dans le cas de la question initiale - demandant spécifiquement où il connaît le charbon représente un nombre - c'est la bonne réponse
Don Cheadle

@mmcrae Je ne pense pas - la question originale demande charà intsans utiliser d' stringabord.
NetMage

164

Cela le convertira en un entier:

char foo = '2';
int bar = foo - '0';

Cela fonctionne car chaque caractère est représenté en interne par un nombre. Les caractères «0» à «9» sont représentés par des nombres consécutifs, donc trouver la différence entre les caractères «0» et «2» donne le chiffre 2.


5
Il suppose un certain jeu de caractères.
EricSchaefer

8
Non, tant que les chiffres sont dans l'ordre (ce que les compilateurs exigent du jeu de caractères), cela fonctionnera, quelle que soit la valeur sur laquelle ils commencent.
Jeremy Ruten

2
C'est bien, sauf que vous devez tout d'abord faire la vérification des limites, et à ce stade, je ne suis pas sûr que int.parse (foo.ToString ()) soit plus rapide.
Matthew Flaschen

7
@EricSchaefer Mais c'est une hypothèse sûre en C #: charest toujours UTF-16.
svick

2
@svick petit point et ancien maintenant, mais depuis que vous avez publié ceci, nous avons fait sortir Core, qui utilise UTF-8. Encore une hypothèse sûre, cependant.
Joel Coehoorn

84

Quelqu'un a-t-il envisagé d'utiliser int.Parse()et int.TryParse()aimer

int bar = int.Parse(foo.ToString());

Encore mieux comme ça

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}

C'est beaucoup plus sûr et moins sujet aux erreurs


2
Absolument la bonne approche. Choisissez le premier si vous voulez lancer des entrées non-int, le second si vous voulez faire autre chose.
Jay Bazuzi

C'est une bonne approche pour une méthode de conversion générique. En passant, c'est un autre exemple de la façon dont .NET promeut les bloatware. (Je veux dire, continuez et testez TryParse () et ToString () - vous ne pouvez pas, pas pratiquement).
déconnexion du

5
@logout non, c'est un exemple de la façon dont une réponse sur StackOverflow favorise le bloatware. C'est en effet inutilement gonflé, et je ne comprends pas pourquoi cela est considéré comme supérieur à la soustraction '0'du caractère.
Roman Starkov

26
char c = '1';
int i = (int)(c-'0');

et vous pouvez en créer une méthode statique:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

C'est ce que je cherchais. Vous pourriez peut-être expliquer ce que vous faites avec la partie moins zéro.
Xonatron

10

Essaye ça

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

Votre commentaire dit '9', mais votre code l'a 9, qui ne se compilera pas.
svick

7

Par défaut, vous utilisez UNICODE donc je suggère d'utiliser la méthode de faulty

int bar = int.Parse(foo.ToString());

Même si les valeurs numériques ci-dessous sont les mêmes pour les chiffres et les caractères latins de base.


4

Cela convertit en un entier et gère unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Vous pouvez en savoir plus ici .


4

Le vrai moyen est:

int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);

"theNameOfYourInt" - le entier vers lequel vous voulez que votre caractère soit transformé.

"theNameOfYourChar" - Le caractère que vous souhaitez utiliser pour qu'il soit transformé en un int.

Laissez tout le reste être.


2

Principe:

char foo = '2';
int bar = foo & 15;

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

0   -   0011 0000
1   -   0011 0001
2   -   0011 0010
3   -   0011 0011
4   -   0011 0100
5   -   0011 0101
6   -   0011 0110
7   -   0011 0111
8   -   0011 1000
9   -   0011 1001

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

Usage:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
yivi

2

Je suis d'accord avec @Chad Grant

Aussi bien si vous convertissez en chaîne, vous pouvez utiliser cette valeur comme numérique, comme indiqué dans la question

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2

J'ai essayé de créer un exemple plus simple et compréhensible

char v = '1';
int vv = (int)char.GetNumericValue(v); 

char.GetNumericValue (v) renvoie comme double et se convertit en (int)

Utilisation plus avancée en tant que tableau

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

0

Comparaison de certaines des méthodes basées sur le résultat lorsque le caractère n'est pas un chiffre ASCII:

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

J'utilise Compact Framework 3.5 et je n'ai pas de méthode "char.Parse". Je pense que ce n'est pas mal d'utiliser la classe Convert. (Voir CLR via C #, Jeffrey Richter)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

Fonctionne avec les caractères ASCII ou Unicode


-4

Cela a fonctionné pour moi:

int bar = int.Parse("" + foo);

5
En quoi est-ce différent int.Parse(foo.ToString()), sauf pour être moins lisible?
svick

-5

J'ai vu de nombreuses réponses mais elles me semblent déroutantes. Ne pouvons-nous pas simplement utiliser le type Casting.

Par exemple: -

int s;
char i= '2';
s = (int) i;

1
Cela renverrait le code ASCII du caractère 2, pas la valeur 2.
cavpollo

Alors que diriez-vous d'utiliser char.GetNumericValue (il renvoie une valeur double) et de le convertir en int.
Apprenti le

Ouais, c'est ce que propose la réponse acceptée de @Chad Grant
cavpollo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.