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.
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
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();
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.
int i = (int)char.GetNumericValue(c);
Encore une autre option:
int i = c & 0x0f;
Cela devrait accomplir cela aussi.
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
int val = '1' - 48;
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';
}
}
Le moyen le plus sûr d’y parvenir est d’utiliser la méthode Int32.TryParse. Voir ici: http://dotnetperls.com/int-tryparse
Vous pouvez essayer quelque chose comme ça:
int val = Convert.ToInt32("" + '1');
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;
}
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, ...)