Question

J'ai un caractère en c #:

char foo = '2';

Maintenant, je veux obtenir 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 que sur les chaînes.

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

Était-ce utile?

La solution

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

  

Utilisez les méthodes GetNumericValue pour   convertir un objet Char qui représente   un nombre à un type de valeur numérique. Utilisation    Analyser et TryParse pour convertir un   caractère dans une chaîne en Char   objet. Utilisez ToString pour convertir un Char   objet à un objet String .

http://msdn.microsoft.com/en-us/ bibliothèque / system.char.aspx

Autres conseils

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 numéro. Les caractères "0" à "9" sont représentés par des nombres consécutifs. Ainsi, la différence entre les caractères "0" et "2" donne le nombre 2.

Quelqu'un a-t-il déjà envisagé d'utiliser int.Parse () et int.TryParse () comme ceci

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
}

Il est beaucoup plus sûr et moins sujet aux erreurs

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

et vous pouvez créer une méthode statique à partir de celle-ci:

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

Essayez ceci

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

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

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

.

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

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

Ceci convertit en un entier et gère unicode

CharUnicodeInfo.GetDecimalDigitValue ('2')

Vous pouvez en savoir plus ici .

La vraie façon est:

  

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

" leNomDeVotreInt " - l'entier que vous voulez transformer en votre personnage.

" theNameName of YourThar " - Le personnage que vous voulez utiliser pour qu'il soit transformé en un entier.

Laissez tout le reste être.

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 des 4 premiers LSB (en utilisant AND au niveau du bit avec 8'b00001111 égal à 15), vous obtenez le nombre réel (0000 = 0,0001 = 1,0010 = 2, ... )

Utilisation:

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

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

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

J'utilise Compact Framework 3.5 et je n'ai pas de "char.Parse". méthode. 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

Je suis d'accord avec @Chad Grant

Aussi, si vous convertissez en chaîne, vous pouvez utiliser cette valeur sous forme 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 plus compréhensible

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

char.GetNumericValue (v) est renvoyé sous forme de double et converti en (int)

Utilisation plus avancée en tant que tableau

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

J'ai vu beaucoup de réponses mais elles me semblent confuses. Ne pouvons-nous pas simplement utiliser le casting de type.

Par exemple: -

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

Cela a fonctionné pour moi:

int bar = int.Parse("" + foo);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top