Réponses:
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
double, cependant
Char.GetNumericValue('⅓')revient effectivement 0.3333.... Merci d'avoir fait remarquer cela!
que diriez-vous (pour char c)
int i = (int)(c - '0');
qu'est-ce que 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();
int.Parse, c'est- à -dire qu'une exception est levée sur une entrée invalide, vous devrez ajouter une vérification de limites supplémentaires:if (i < 0 || i > 9) throw new FormatException();
Ce que tout le monde oublie, c'est d'expliquer POURQUOI cela se produit.
Un Char, est essentiellement 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 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 recherche la valeur entière dans le tableau '0'dont est alors la «valeur de base» en soustrayant votre nombre au format char de cela vous donnera le nombre d'origine.
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';
}
}
charen, intnous devons vérifier la plage du paramètre d'entrée, pas la intvaleur de sortie .
intvaleur du résultat car la plage de caractères numériques a été effectuée au début de la méthode, il y aura donc une valeur résultante correcte, si le caractère spécifié n'est pas dans la plage de caractères numériques, une exception sera levée. La même logique que vous avez fournie mais la vérification de la plage est effectuée au début de la méthode.
if (c < 0 || c > 9)...
Le moyen le plus sûr d'y parvenir consiste à utiliser la méthode Int32.TryParse. Voir ici: http://dotnetperls.com/int-tryparse
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 ET au niveau du bit avec 8'b00001111 qui équivaut à 15), vous obtenez le nombre réel (0000 = 0,0001 = 1,0010 = 2, ...)
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;
}